PHP 快速获取IP地理信息

本文最后更新于$day天前,文中所描述的信息可能已发生改变。

书接上一回,现在API那么方便,但是获取IP地址的API大多收费,也麻烦。我们怎样用PHP快速查询到IP地址的所在地呢?

IPIP.net 是现在比较准确的数据库,免费提供可以精确到地级市的IP数据,也能满足我们大部分使用场景。因为IP地址数据经常变化,所以一些没维护的数据,可能已经失效了。

数据库下载地址: https://www.ipip.net/free_download/

纯真数据库IPDB版本:https://github.com/metowolf/qqwry.ipdb

下载数据需要注册并且登陆。

PHP API Github 地址:https://github.com/ipipdotnet/ipdb-php

下载完成后,放在根目录,因为是免费,只有city.php有效,其他基站api也没必要,可以适度精简。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
require_once __DIR__.'/ipip/db/Reader.php';
require_once __DIR__.'/ipip/db/City.php';

$city = new ipip\db\City(__DIR__.'/ipipfree.ipdb');


$ip = $city->find(getip(),"CN");
echo 'var lo="'.$ip[1].'", lc="'.$ip[2].'"; var localAddress={city:"'.$ip[2].'", province:"'.$ip[1].'"}';

function getip()
{
static $ip = '';
$ip = $_SERVER['REMOTE_ADDR'];
if (isset($_SERVER['HTTP_CDN_SRC_IP'])) {
$ip = $_SERVER['HTTP_CDN_SRC_IP'];
} elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) and preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
foreach ($matches[0] as $xip) {
if (!preg_match('#^(10172\.16192\.168)\.#', $xip)) {
$ip = $xip;
break;
}
}
}
return $ip;
}