You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP中通过IP地址获取地理位置信息(含国家/州代码、城市名)

Hey,在PHP里实现通过IP获取国家代码、州代码和城市名称,我有两个常用的方案,分别适合不同的场景,给你拆解清楚:

方案一:本地数据库查询(MaxMind GeoIP2)

这个方案的优势是不依赖外部服务、响应速度快,适合对稳定性要求高的场景,唯一需要做的是定期更新数据库。

  • 第一步:获取免费数据库
    去MaxMind官网注册账号,下载免费的GeoLite2 City数据库(格式为MMDB),这是目前最常用的免费IP地理数据库之一。

  • 第二步:安装PHP依赖
    用Composer安装官方的GeoIP2库,执行以下命令:

    composer require geoip2/geoip2
    
  • 第三步:编写查询代码
    示例代码如下,记得替换成你自己的数据库路径:

    require_once 'vendor/autoload.php';
    use GeoIp2\Database\Reader;
    
    try {
        // 初始化数据库读取器
        $reader = new Reader('/path/to/GeoLite2-City.mmdb');
        // 要查询的IP地址,也可以用用户的真实IP,比如$_SERVER['REMOTE_ADDR']
        $ip = '8.8.8.8';
        $record = $reader->city($ip);
    
        // 获取需要的字段
        $countryCode = $record->country->isoCode; // 国家代码,比如US
        $stateCode = $record->mostSpecificSubdivision->isoCode; // 州/省份代码,比如CA
        $cityName = $record->city->name; // 城市名称,比如Mountain View
    
        // 输出结果
        echo "国家代码:$countryCode\n";
        echo "州代码:$stateCode\n";
        echo "城市名称:$cityName\n";
    
        $reader->close();
    } catch (\Exception $e) {
        // 处理异常,比如无效IP、数据库文件错误等
        echo "查询失败:" . $e->getMessage();
    }
    
方案二:调用第三方API

如果不想维护本地数据库,快速实现功能的话,可以用免费的第三方API,比如ip-api.com(免费版有请求限制,商用需付费)。

  • 示例代码(用curl实现,比file_get_contents更稳定):
    $ip = '8.8.8.8';
    $url = "http://ip-api.com/json/{$ip}?fields=status,countryCode,regionCode,city";
    
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5); // 设置超时时间
    $response = curl_exec($ch);
    curl_close($ch);
    
    if ($response) {
        $data = json_decode($response, true);
        if ($data['status'] === 'success') {
            $countryCode = $data['countryCode'];
            $stateCode = $data['regionCode'];
            $cityName = $data['city'];
    
            echo "国家代码:$countryCode\n";
            echo "州代码:$stateCode\n";
            echo "城市名称:$cityName\n";
        } else {
            echo "查询失败:" . $data['message'];
        }
    } else {
        echo "API请求失败";
    }
    
一些关键注意事项
  • 获取用户真实IP:如果你的服务器在反向代理(比如Nginx、Cloudflare)后面,$_SERVER['REMOTE_ADDR']会是代理服务器的IP,这时候要从$_SERVER['HTTP_X_FORWARDED_FOR']或$_SERVER['HTTP_CF_CONNECTING_IP'](Cloudflare场景)获取用户真实IP。
  • 免费API限制:像ip-api的免费版每分钟最多45次请求,超过会被封禁,商用项目建议选择付费API(比如MaxMind的付费服务、IPinfo等)。
  • 本地数据库更新:GeoLite2数据库每月更新一次,记得设置定时任务自动下载更新,保证数据准确性。

内容的提问来源于stack exchange,提问作者D Raja Nama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:06:05