php 使用 GeoIP 扩展获取 ip 各种信息
项目背景
公司 App 上准备针对客户的ip来推荐最优服务器来快连设备,目前有4个节点,北京、俄勒冈、新加坡、法兰克福。客户端上报 IP,云端根据分配规则返回 server 代号。
资料搜集
一开始打算找第三方的一些API,测试了很多ip定位接口,效果并不好,有的收费,有的需要申请key有调用次数限制,大部分API只有国家和城市的信息,而且不规范,不是国家代码,抓取到结果还需要进一步匹配,因为没有大洲信息,还要自己根据国家去
mapping 大洲。
上面的各种缺点,直接放弃第三方的API,于是找到了 GeoIP
这个扩展,这个有纯PHP版本的,但是我没找到如何获取大洲,直接上C扩展版的,性能肯定没问题,装好扩展,geoip_continent_code_by_name 直接获取大洲简称代码。
php 扩展安装
我的是 Docker 环境 Ubuntu14.04 php5.6, 下面是扩展的安装命令。
1 | apt-get -y --force-yes install php5.6-geoip |
注意:--no-install-recommends 这个参数一定不要加,有这个的话安装完成会把 IP 数据包删除的, 我 build docker 镜像的时候吃过亏了,下面是 IP 数据包的目录。
1 2 | root@1e1931746c6c:/usr/share/GeoIP# ls GeoIP.dat GeoIPv6.dat |
GeoIP 扩展源码下载: https://pecl.php.net/package/geoip
以下是源码安装步骤:
1 2 3 4 5 6 | $ cd geoip-1.1.1 $ phpize $ ./configure $ make $ sudo make install |
编写代码
在 phpinfo 能看到 GeoIP,就说明扩展安装好了。
这是 GeoIP 扩展的文档,一个函数获取想要的信息,完全满足了我的需求,比第三方 API 好用的多,直接省去网络请求。
http://php.net/manual/zh/book.geoip.php