最近易支付后台首页打开速度贼慢,最慢竟然需要15s,我的天......接近崩溃,我一度怀疑是我的SQL查询有问题,反复测试,结果发现是IP城市查询的接口出现问题。
函数里面用的原接口是淘宝IP库,现在这个接口可能由于用的人多了非常不稳定,所以才导致CURL获取很慢,一度出现无法获取的问题。
百度看一会儿,大部分封装的不是新浪就是淘宝接口,没发现合适的。但是我发现了另外一个github项目【ip2region】。
项目地址:https://github.com/lionsoul2014/ip2region
介绍:ip2region - 最自由的ip地址查询库,ip到地区的映射库,提供Binary,B树和纯内存三种查询算法,妈妈再也不用担心我的ip地址定位。
1. 99.9%准确率,定时更新:
数据聚合了一些知名ip到地名查询提供商的数据,这些是他们官方的的准确率,经测试着实比纯真啥的准确多了。
每次聚合一下数据需要1-2天,会不定时更新。
2. 标准化的数据格式:
每条ip数据段都固定了格式:城市Id|国家|区域|省份|城市|ISP
只有中国的数据精确到了城市,其他国家只能定位到国家,后前的选项全部是0,已经包含了全部你能查到的大大小小的国家。 (请忽略前面的城市Id,个人项目需求)
3. 体积小:
生成的数据库文件ip2region.db只有1.5M(1.2版本前是3.5M)
4. 多查询客户端的支持,0.0x毫秒级别的查询
已经集成的客户端有:java、C#、php、c、python、nodejs、php扩展(php5和php7)、golang、rust、lua、lua_c。
看到有现成的封装调用,于是基于原来的修改一下,做成了一个API,方便自己在不同平台调用。
调用地址:https://qzone.work/api/ip?ip=220.181.57.216
返回数据:
{
"time": 0.0026619434356689, //查询耗时/秒
"info": "success",//返回信息
"data": {//返回的IP数据
"city_id": 995,
"region": "中国|0|上海|上海市|电信"
},
"status": "0" //查询状态码,0:成功
}
封装代码:
<?php
/*
*https://github.com/lionsoul2014/ip2region
*/
$ip = $_GET['ip'];
$t1 = microtime(true);
header("Content-type:text/json;charset=UTF-8");
$result = array(
'time' => Null,//微秒时间戳
'info' => Null,
'data' => Null,
'status' => '1'
);
if (filter_var($ip, FILTER_VALIDATE_IP)) {
$dbFile = dirname(__FILE__) . '/ip2region.db';
require dirname(__FILE__) . '/Ip2Region.class.php';
$ip2regionObj = new Ip2Region($dbFile);
$method = 'btreeSearch';
$algorithm = 'B-tree';
$data = $ip2regionObj->{$method}($ip);
$result['info'] = 'success';
$result['status'] = '0';
$result['data'] = $data;
} else {
$result['info'] = 'ip不合法';
$result['status'] = '1';
}
$result['time'] = microtime(true) - $t1;
exit(json_encode($result));
?>
Ps:如果你要自己封装,代码里面用到的ip2region.db和Ip2Region.class.php需要自己去项目里面下载,这里就不提供了。