PHP-GeoIP库及官方geoip扩展已废弃,PHP 7.4+移除该扩展,导致geoip/geoip包运行时报Class not found或函数未定义;应改用MaxMind GeoLite2与geoip2/geoip2库,纯PHP实现、无需C扩展、需定期更新.mmdb文件。

PHP-GeoIP 库本身已废弃多年,官方 geoip 扩展也早在 PHP 7.4 起被移除;直接用 Composer 安装旧版 phpgeoip 或 geoip/geoip 会导致运行时 Fatal error: Class 'GeoIP' not found 或 undefined function geoip_country_name_by_addr() —— 这不是配置问题,是底层依赖已失效。
为什么 Composer install geoip/geoip 会失败或报错
旧版 geoip/geoip(如 v1.19)依赖系统级的 libgeoip C 库和 PHP 的 geoip 扩展,而该扩展在 PHP 7.4+ 中被彻底移除,且不再维护。Composer 可以下载包,但 require 后调用会直接崩溃。
- 运行
composer require geoip/geoip成功 ≠ 能用 - 即使强制启用
extension=geoip.so,PHP 8.x 会提示Extension 'geoip' not present - GitHub 上该仓库最后更新是 2016 年,issue 区大量未修复的 segfault 和 IPv6 支持缺失
替代方案:改用 MaxMind GeoLite2 + geoip2/geoip2
MaxMind 已停更 GeoLite Legacy(即旧 GeoIP 数据库),只提供 GeoLite2 格式,对应 PHP 客户端必须用 geoip2/geoip2。它纯 PHP 实现,不依赖 C 扩展,支持离线使用,且数据每月更新。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 安装:
composer require geoip2/geoip2 - 需单独下载
GeoLite2-City.mmdb(免费版),放在项目目录如data/GeoLite2-City.mmdb - 初始化方式不是
new GeoIP(),而是:$reader = new \GeoIp2\Database\Reader('data/GeoLite2-City.mmdb'); - 查询返回对象,非数组:
$record->country->name、$record->city->name、$record->location->latitude
离线定位精度取决于数据库版本和 IP 类型
GeoLite2 免费版对 IPv4 城市级定位准确率约 99.8%,但 IPv6 精度明显下降(部分段仅能定位到国家);商用版才支持 ASN、组织名等字段。离线场景下,务必注意:
- 数据库文件必须定期更新(MaxMind 每月第一个周二发布新版),建议加 cron 自动下载:
wget -O data/GeoLite2-City.mmdb.gz https://github.com/maxmind/geoipupdate/releases/download/v5.2.0/GeoLite2-City_20240402.tar.gz - 不要用
file_get_contents()直接读取 .mmdb —— 必须用GeoIp2\Database\Reader,否则解析失败 - 本地开发时若遇到
GeoIp2\Exception\AddressNotFoundException,说明该 IP 不在数据库中(常见于私有地址、新分配 IP 或 Tor 出口节点)
真正离线可用、无扩展依赖、精度可控的路径只有一条:用 geoip2/geoip2 + 定期更新的 .mmdb 文件。任何试图复用老 GeoIP 接口的封装层,最终都会卡在 PHP 版本兼容或数据过期上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










