欢迎莅临
人的生命在于折腾,我喜欢折腾我自己~

PHP 快速获取IP地理信息

书接上一回,现在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也没必要,可以适度精简。

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('#^(10|172\.16|192\.168)\.#', $xip)) {
                $ip = $xip;
                break;
            }
        }
    }
    return $ip;
}
赞(0) 打赏
未经允许不得转载:邓子乐的札记 » PHP 快速获取IP地理信息
0

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏