Geoip在PHP中的用法
今天研究了如何通过IP获取地理位置,网上搜索了一下没有特别满意的,因为他们都不能提供IP所在大洲的信息或是要收费。不过还是找到了一个不错的免费IP定位接口(国外的IP定位接口服务基本都是收费的 如:ip2location.com),现在将网站共享出来:http://freegeoip.net/static/index.html 当然,可能你已经在google见过这个网站了。
接下来主要说一下如何在PHP中使用Geoip功能,以及如何获得IP所在的大洲信息。
最终实现目的还因为 http://www.21andy.com/blog/20100405/1799.html 这篇文章帮了大忙。
通过这篇文章我找到了:
- Geoip 数据文件(点击这里可下载)
- Geoip 的PHP文件(上面提到的的文章中的链接已经失效,后来尝试在url的上级目录找了一下还是被我找到。)到 http://geolite.maxmind.com/download/geoip/api/php/ 下载最新版就行了,我下载的是 php-1.11.tar.gz 。
接着将 php-1.11.tar.gz 的文件解压出来并部署到你的服务器,这时如果你尝试访问 sample.php 服务器会报错,因为Geoip.dat还没准备好呢!将刚刚下载的 GeoIP.dat.gz 中的文件解压出来放到 sample.php文件的同一个目录下。最后编辑一下 sample.php ,将里面的Geoip.dat 路径改一下 /usr/local/share/GeoIP/GeoIP.dat 改为 ./GeoIP.dat。现在,你可以访问 sample.php了,尝试更改sample.php中的IP你将得到不同的结果。
现在我们已经实现了IP定位国家的功能,但是在 php手册中提到的 geoip_continent_code_by_name ( string $hostname
) 方法我却没找到。于是我试着在 geoip.inc 搜索 continent 关键字,发现里面是有定义 continent 属性的,只是没有获取 continent 的方法。按照惯例,抱着试试看的心态,我在 geoip.inc 里添加了下面这方法:
function geoip_continent_code_by_addr($gi, $addr) {
if ($gi->databaseType == GEOIP_CITY_EDITION_REV1) {
$record = geoip_record_by_addr($gi,$addr);
if ( $record !== false ) {
return $record->continent_code;
}
} else {
$country_id = geoip_country_id_by_addr($gi,$addr);
if ($country_id !== false) {
return $gi->GEOIP_CONTINENT_CODES[$country_id];
}
}
return false;
}
接着就在 sample.php 里面使用这个方法成功获取了 continent,至此已经达成目标。
希望这篇文章可以帮到有需要的人。
原文地址:http://www.zhshipu.com/geoip%e5%9c%a8php%e4%b8%ad%e7%9a%84%e7%94%a8%e6%b3%95/