技术饭
php解析ip地址的免费纯真IP数据库
之前使用的tp3的UTFWry.dat作为ip解析,但是感觉这个类有点旧,还比较难用,数据不多,如果需要其他信息还需要重新修改IpLocation.php类,淘宝腾讯提供的免费第三方获取ip的方式不太稳定,所以找了找还是基于qqwry.dat的ip库相对合适。
itbdw/ip-database是免费IP数据库 (纯真IP库,已经格式为国家、省、市、县、运营商),此工具基于纯真 IP 库,并且把非结构化的数据结构化。
一旦识别了 IP,都可以显示国家。国内 ip 都能识别出省,基本可以识别出市、运营商,有部分能识别出县,以及公司小区学校网吧等信息。
环境要求
只需要 php 环境即可本地解析 ip。 不需要网络请求。 第一次查询即读入内存,以后直接从内存读取,效率非常高。
使用说明
composer require 'itbdw/ip-database'
//根据实际情况,基本上用框架(如 Laravel)的话不需要手动引入
//require 'vendor/autoload.php';
use itbdw\Ip\IpLocation;
//支持自定义文件路径
$qqwry_filepath = '/abspath/qqwry.dat';
echo json_encode(IpLocation::getLocation($ip, $qqwry_filepath), JSON_UNESCAPED_UNICODE) . "\n";
echo json_encode(IpLocation::getLocation($ip), JSON_UNESCAPED_UNICODE) . "\n";
使用实例:
//限制某个地方的ip
$ip = '192.168.0.1';
$iplimit_res = $this->limitip($ip, ['河北', '广东', '浙江', '山东', '江苏', '黑龙江', '安徽', '河南', '湖北', '辽宁', '北京', '汕尾']);
if($iplimit_res == 1){
//返回数据
$rdata['code'] = 0;
$rdata['msg'] = '奖品已抽完';
return json($rdata);
}
/**
* [limitip 限制IP]
*/
private function limitip($ip = '', $limit_key = ['广东省', '广东', '广州', '汕尾']) {
//获取IP
$ip = !empty($ip) ? $ip : $this->request->ip();
//实例化IP类
//$iplocation = new \iplocation\IpLocation();
//获取IP信息
//$ipdata = $iplocation->getlocation($ip);
//获取IP信息
$ipdata = \itbdw\Ip\IpLocation::getLocation($ip);
//处理,默认结果是0
$res = 0;
if(!empty($limit_key) && is_array($limit_key) && isset($ipdata['area']) && isset($ipdata['country'])){
foreach ($limit_key as $key_ip => $value_ip) {
//必须是中国并且在范围内
if(!preg_match('/中国/', $ipdata['country']) || preg_match('/'.$value_ip.'/', $ipdata['area'])){
$res = 1;
break;
}
}
}
//返回数据
return $res;
}
itbdw/ip-database地址:https://github.com/itbdw/ip-database
淘宝ip库:http://ip.taobao.com/instructions
据说淘宝ip库不太稳定,比较慢,做简单的功能还好,不适合高并发的。
文明上网理性发言!