接口异步更新ip信息
最后更新于:2022-04-02 04:32:40
## 接口异步更新ip信息
一般拿到客户端ip之后,我们希望解析出来ip的具体位置信息,这个可以用ip地址库来做,但缺点是不能及时更新,不够实时,所以最好使用在线接口去做,比如新浪或淘宝的ip查询接口。那怎么利用接口查询ip信息,并保存到数据库呢,因为只需要查询一次就可以。
是插入数据时查询接口吗?插入数据时查询,由于不能保证接口的稳定性,这会增加插入操作的响应时间,这并不可行。
还有一种方法,那就是用一个接口,前端ajax异步请求后端,后端curl请求第三方接口更新ip信息,更新后保存,这样只需要更新一次就可以。
做一个接口更新ip详细信息,只更新一次,**但要注意用行锁锁住防止并发更新问题**,因为ip是动态分配经常变动的,要实时近期数据才准确。不这样做的话还有其它方案,队列或者计划任务批处理,但都不是最优方案,这种接口让前端ajax调用才是最优方案。
前端伪代码:
```javascript
if (data.ip_info == '') {
getIpInfo(data.id)
}
```
后端伪代码:
```php
function getIpInfo($id) {
// 开启事务用行锁
Db::startTrans();
try {
if ($info = Db->lock(true)->find($id)) {
if ($info['ip_info']) {
throw new \Exception('ip数据已更新!');
}
$ipInfo = curl($info['ip']);
// 更新ip信息
Db::update(['ip_info' => $ipInfo]);
} else {
throw new \Exception('数据不存在!');
}
Db::commit();
} catch (\Exception $e) {
Db::rollback();
$errMsg = $e->getMessage() ?: '系统忙!';
}
}
```
* * * * *
last update:2018-7-1 10:36:46
';