本文最后更新于$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; }
|