最近在做一个IP定位显示国家省市功能,在全网找了一圈,也每个安装体验过,测试他的数据库精准度。
本人是用PHP的第三方库,整理以下使用过的ip定位转地理位置库。
ip定位转地理位置库
1.itbdw/ip-database:
**gihub地址:**https://github.com/itbdw/ip-database
**特点:**支持将IP转化为结构化的国家、省、市、县、运营商、地区信息,IP数据库源于免费的纯真IP数据库。
安装:composer require 'itbdw/ip-database' ^3.0
**测试感受:**由于用的免费社区版的纯真数据库,ip库不全,电脑定位准,手机定位不太精准,可能定位在本省其他市。
**推荐指数:**⭐ ⭐⭐ ⭐⭐
使用方法:
//根据实际情况,基本上用框架(如 Laravel)的话不需要手动引入
//require 'vendor/autoload.php';
use itbdw\Ip\IpLocation;
//0配置使用
echo json_encode(IpLocation::getLocation($ip), JSON_UNESCAPED_UNICODE) . "\n";
//支持自定义文件路径
$qqwry_filepath = '/abspath/qqwry.dat';
$ipv6wry_path = '/abspath/ipv6wry.db';
echo json_encode(IpLocation::getLocation($ip, $qqwry_filepath), JSON_UNESCAPED_UNICODE) . "\n";
#响应返回
{
"ip": "163.177.65.160",
"country": "中国",
"province": "广东",
"city": "深圳市",
"county": "",
"isp": "联通",
"area": "中国广东省深圳市腾讯计算机系统联通节点"
}
2.zhuzhichao/ip-location-zh:
gihub地址:https://github.com/zhuzhichao/ip-location-zh
**特点:**可以获得是 中国河南郑州,以及中国行政区划代码(支持到市级), 同样能获得国外的地址,但是没有国内详细。用的是IPIP.net的数据库
安装:composer require "zhuzhichao/ip-location-zh"
测试感受: IPIP.net的数据库是2019年,无语是电脑和手机,定位都不太准确
推荐指数: ⭐ ⭐⭐ ⭐
使用方法:
require 'vendor/autoload.php';
use Zhuzhichao\IpLocationZh\Ip;
var_dump(Ip::find('171.12.10.156'));
3.zoujingli/ip2region:
gihub地址: https://github.com/zoujingli/ip2region
特点: 基于 ip2region
简单整合,ip2region v2.0 - 是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。可实现自动更新IP数据库API
安装:composer require zoujingli/ip2region"
测试感受: IP纯数据库比较新,响应快,功能齐全,支持多种语言。不过只能返回,国家|区域|省份|城市|ISP字符串,不能返回数据,需要自行改造。
ip2region开源:https://github.com/lionsoul2014/ip2region。
**推荐指数:**⭐ ⭐⭐ ⭐⭐
使用方法:
$ip2region = new \Ip2Region();
$result = $ip2region->simple('171.12.10.156');
自行改造返回数组,找到simple
方法修改下toRegion
/**
* 返回数组 [国家|区域|省份|城市|ISP]
* @param $ip
* @return false|string[]
* @throws Exception
*/
public function toRegion($ip)
{
$geo = $this->memorySearch($ip);
$arr = explode('|', str_replace(['0|'], '|', isset($geo['region']) ? $geo['region'] : ''));
if (($last = array_pop($arr)) === '内网IP') $last = '';
array_push($arr, (empty($last) ? '' : "{$last}"));
return $arr;
}