PHP实现IP地理位置查询的两种方案

沈亦白
沈亦白
发布时间:2026-10-14 | 1人浏览过
原创

本文详解了如何利用PHP获取IP对应的地理位置信息。文章介绍了基于腾讯IP分享计划接口的HTTP请求方案,以及基于纯真IP本地数据库的离线解析方案,分别适用于不同场景。

使用腾讯IP分享计划接口

腾讯QQ拥有庞大的IP地址库,其提供的“IP分享计划”允许开发者通过特定URL参数获取IP归属地信息。该方法无需维护本地库,适合访问量不大的应用场景。

第1步:构造请求与执行CURL

腾讯IP分享的固定格式为:http://ip.qq.com/cgi-bin/searchip?searchip1=$queryIP。
我们需要使用curl发起GET请求,并特别注意返回数据的编码问题。

<?php
function getIPLoc_QQ($queryIP){
    // 构造请求URL
    $url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;
    
    // 初始化CURL
    $ch = curl_init($url);
    curl_setopt($ch,CURLOPT_ENCODING ,'gb2312'); // 指定接收编码
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 获取数据返回
    
    $result = curl_exec($ch);
    
    // 腾讯返回的是gb2312编码,需转换为utf-8以防乱码
    $result = mb_convert_encoding($result, "utf-8", "gb2312"); 
    
    curl_close($ch);
    return $result;
}
?
>

第2步:解析响应内容

腾讯接口返回的是HTML片段,通常包含在<span>标签中。我们可以使用正则表达式提取目标文本。

// 假设$result是上述函数返回的内容
preg_match("@<span>(.*)</span></p>@iU", $result, $ipArray);
$loc = isset($ipArray[1]) ? $ipArray[1] : '未知';

// 测试调用
echo getIPLoc_QQ("183.37.209.57"); 
?>

注意:第三方API可能存在频率限制或失效风险,生产环境建议增加容错处理。

使用纯真IP数据库(推荐用于高并发/内网)

对于需要频繁查询或处于内网隔离环境的场景,依赖外部API并不合适。此时可使用开源的纯真IP数据库(qqwry.dat),将其存储在服务端进行本地匹配。

第1步:准备纯真IP库文件

  • 从网络下载最新的 qqwry.dat 文件。
  • 将文件放置于项目可读取路径下,例如 /data/ip/qwqwry.dat。

第2步:引入IP解析类库

可以使用成熟的第三方类库,如 PurePHP/IpLocation 或自行封装二进制读取逻辑。以下是一个简化的使用思路,展示如何加载并查找IP:

<?php
// 伪代码示例,具体逻辑请参考完整的纯真IP解析类库
require_once 'IpLocation.class.php';

$ipLocation = new IpLocation('qqwry.dat');
$address = $ipLocation->getlocation('183.37.209.57');

if ($address['country'] == '局域网' || $address['country'] == 'ZLAN') {
    $address['country'] = '本机IP';
}
echo $address['country'] . ' ' . $address['area'];
?>

关键注意事项与排错

在使用IP定位功能时,需关注以下几点以确保准确性:

  1. 编码一致性:无论是API请求还是本地文件读取,务必确保最终输出的字符串编码(UTF-8)与前端展示一致,避免中文乱码。
  2. IPv6支持:传统腾讯旧接口和纯真数据库主要基于IPv4设计。若涉及IPv6,需确认所选库是否支持IPv6映射,或寻找专门的IPv6 IP库。
  3. IP真实性校验:客户端提交的IP可能伪造。如果是Nginx前置,应从 $_SERVER["HTTP_X_FORWARDED_FOR"] 或 $_SERVER["REMOTE_ADDR"] 获取真实IP,并注意过滤多级代理中的可信IP。

以上就是PHP利用腾讯IP分享计划或本地数据库获取地理位置的详细内容,更多关于PHP IP定位的技术资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表