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

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

本文详解了如何利用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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。