适合中国大陆,用来统计用户来源城市的场景的免费 IPv4 地址库
本文不谈商业服务,只讨论免费的服务。
如果不考虑商业用途,只是个人学习使用的话,那么 ipip.net 的地址库应该是最好用的,创始人是国内早期的站长。
不过刚发现从2019年开始就停止更新了。。。
企业版是正常更新的:
但如果商业使用,ipip.net 就必须付费了。
还好有国外的这些。
在中国大陆的实际表现(社区与实测汇总)
平均城市级正确率在 60%左右,但省级准确率达 80–90%。
综合来说,推荐优先级如下:
GeoLite2 ≥ IP2Location DB9 ≥ DB-IP Lite
GeoLite2 下载地址
PS: 从 2019 年底开始,下载 GeoLite2-City.mmdb 必须先注册登录 MaxMind 帐号。这是 MaxMind 公司根据隐私法规(GDPR / CCPA)调整后实施的强制措施。
以前(2019 年前)GeoLite2 是完全公开的匿名下载;但自从隐私法规要求对 IP 数据分发进行追踪后,MaxMind 改为:“所有下载必须使用授权 License Key 进行身份验证。”
官方要求的流程
进入 https://www.maxmind.com/en/geolite2/signup 注册账号
注册一个免费 MaxMind 账号(个人邮箱即可,不需企业信息)。
然后登录后访问 https://www.maxmind.com/en/accounts/current/license-key 创建 License Key。
点击 “Generate new license key”,填入名称(例如 laravel_geoip),选择 “No” for “Will this key be used for GeoIP Update program?”(除非你要用 CLI 自动更新),系统生成一串 16 位左右的 Key,如“abCdEfGhIjKlMnOp”,最后使用 key 拼装 URL 下载即可。
例如:
wget "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=YOUR_KEY&suffix=tar.gz" -O GeoLite2-City.tar.gz
解压:
tar -xzf GeoLite2-City.tar.gz
里面就有 GeoLite2-City.mmdb。
也可以使用官方 CLI 工具(可定时更新)。
macOS 用户操作如下( Win/Linux 类似):
brew install geoipupdate
编辑配置文件 /usr/local/etc/GeoIP.conf:
AccountID YOUR_ACCOUNT_ID
LicenseKey YOUR_KEY
EditionIDs GeoLite2-City
执行更新:
geoipupdate
在 PHP 项目中使用
先安装依赖:
composer require geoip2/geoip2
示例代码:
use GeoIp2\Database\Reader;
$reader = new Reader(storage_path('geoip/GeoLite2-City.mmdb'));
$record = $reader->city($ip);
return [
'country' => $record->country->isoCode ?? '',
'province' => $record->subdivisions[0]->names['zh-CN'] ?? '',
'city' => $record->city->names['zh-CN'] ?? '',
'lat' => $record->location->latitude,
'lon' => $record->location->longitude,
];
names['zh-CN'] 可取到中文城市名。
在 Laravel 项目中建议使用下面的这个文件路径:
storage/app/geoip/GeoLite2-City.mmdb
然后 .env 里写路径:
GEOIP_DB_PATH=storage/app/geoip/GeoLite2-City.mmdb
最后补充说明
GeoLite2 仍是免费使用(非商业版),只是需要账户绑定。下载次数有限制(但足够用)。
更新周期:官方每周更新(建议每月拉取一次)。若部署多台服务器,可缓存一份 .mmdb 文件在 OSS/NAS 中同步,不用每台都登录下载。