🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 接口异步更新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