php geoip扩展仅支持已停更的geoip legacy(.dat)数据库,不兼容当前主流geoip2(.mmdb)格式;提供geoip_country_name_by_name()等函数获取地理信息,推荐生产环境迁移到geoip2官方php客户端。

PHP 中的 GeoIP 扩展能通过 IP 地址快速获取国家、城市、经纬度、ISP、时区等地理信息,但要注意它只支持旧版 GeoIP Legacy 数据库(如 GeoLiteCity.dat),不兼容当前主流的 GeoIP2 格式(.mmdb)文件。
GeoIP 扩展的核心能力与限制
该扩展提供一系列函数,例如:geoip_country_name_by_name() 返回国家全称,geoip_record_by_name() 返回含城市、经纬度、邮编等详细记录的数组。但它依赖本地数据库文件,且无法读取 MaxMind 自 2015 年起主推的 GeoIP2 格式 —— 这意味着若你下载的是最新版 GeoLite2-City.mmdb,原生扩展将完全无法使用。
- 支持数据库:GeoIP Legacy(
.dat文件,已停止更新) - 不支持数据库:GeoIP2(
.mmdb文件,当前标准) - 典型函数:geoip_country_code_by_name、geoip_region_by_name、geoip_time_zone_by_country_and_region
安装与基础配置(适用于 PHP 7.x–8.2)
在大多数 Linux 环境中,推荐用系统包管理器安装,避免 PECL 编译问题:
- Debian/Ubuntu:
sudo apt install php-geoip(自动启用扩展并配置路径) - CentOS/RHEL:
sudo yum install php-pecl-geoip或dnf install php-pecl-geoip - 确认生效:
php -m | grep geoip应输出geoip - 数据库路径默认为
/usr/share/GeoIP/;如需自定义,可在php.ini中添加:geoip.custom_directory = "/path/to/your/geoip"
加载并使用 GeoIP Legacy 数据库
从 MaxMind 官网归档页下载免费的 Legacy 数据库(注意不是 GeoIP2):
- 国家库:GeoIP.dat
- 城市库:GeoLiteCity.dat
- 解压后放入配置目录(如
/usr/share/GeoIP/),确保 Web 服务器有读取权限 - 简单调用示例:
$record = geoip_record_by_name($_SERVER['REMOTE_ADDR']);
成功时返回包含country_name、city、latitude、longitude等字段的关联数组
替代方案:推荐迁移到 GeoIP2(更准确、持续更新)
由于 Legacy 数据库已多年未更新,精度下降明显,生产环境建议改用官方维护的 GeoIP2 方案:
- 下载最新
GeoLite2-City.mmdb(免费版):MaxMind 官方页面 - 引入纯 PHP 客户端:
composer require geoip2/geoip2 - 代码示例简洁可靠:
$reader = new \GeoIp2\Database\Reader('/path/to/GeoLite2-City.mmdb');<br>$record = $reader->city($_SERVER['REMOTE_ADDR']);<br>echo $record->country->name; // 如 "China"<br>echo $record->city->name; // 如 "Beijing" - 优势:支持中文名(
$record->country->names['zh-CN'])、IPv6、更细粒度行政区划、活跃维护
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











