MENU

【PHP】IP城市查询API接口(ip2region)

December 1, 2018 • Read: 4148 • 技术杂谈

最近易支付后台首页打开速度贼慢,最慢竟然需要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.dbIp2Region.class.php需要自己去项目里面下载,这里就不提供了。