使用php5-geoip和Maxmind数据库获得IPv6支持

时间:2015-05-07 23:11:08

标签: php geoip

我按照以下相同的步骤(http://php.net/manual/en/geoip.setup.php)设置了geoip:

wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz
sudo mkdir -v /usr/share/GeoIP
sudo mv -v GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat

sudo apt-get install php5-geoip

这种方法非常出色,并且已有多年的IPv4地址。然而,我没有意识到传入的IPv6设备有多么破碎。例如,它返回Notice: geoip_country_code_by_name(): Host 26xx:8:xx00:cf20:caxx:ff:fexx:35b5 not found

我经历了很多尝试捏造它的事情,包括:

  • 测试v6地址并使用geoip_open("/usr/share/GeoIP/GeoIPv6.dat", GEOIP_STANDARD);

显然geoip_open不是一个可用的函数ala php5-geoip

  • 我尝试过使用geoip_country_code_by_name_v6($ip)

即使geoip_country_code_by_name($ip)效果很好,这是另一项功能无法使用。

到目前为止无济于事。

我有什么方法可以轻松地在我的PHP代码中选择我想要使用的数据库,以便我可以简单地测试它是IPv4还是IPv6地址并加载相应的数据库?

1 个答案:

答案 0 :(得分:4)

为了轻松支持IPv6->国家/地区代码,并且没有基于上述集成的不必要文件:

获取最新的旧IPv6数据的副本(我假设您已经拥有IPv4二进制文件):

wget http://geolite.maxmind.com/download/geoip/database/GeoIPv6.dat.gz

解压缩并将其移动到您的网络服务器可访问的目录:

gunzip GeoIPv6.dat
mv GeoIPv6.dat /etc/usr/share/GeoIP/GeoIPv6.dat

从Maxmind git dir(https://github.com/maxmind/geoip-api-php/blob/master/src/geoip.inc)获取geoip.inc的副本,并将其保存在您可以访问的任何地方,无论您需要运行geoip。

如果你像我一样安装了php5-geoip,请用sudo apt-get remove php5-geoip删除它;必要时进行清洗。

完成上述操作后,您现在可以测试v4或v6的传入IP地址并获得适当的结果。

示例:

<?php
include_once('geoip.inc');

//set an IPv6 address for testing
$ip='2601:8:be00:cf20:ca60:ff:fe09:35b5';

/*
test if $ip is v4 or v6 and assign appropriate .dat file in $gi
run appropriate function geoip_country_code_by_addr() vs geoip_country_code_by_addr_v6()   
*/
if((strpos($ip, ":") === false)) {
    //ipv4
    $gi = geoip_open("/usr/share/GeoIP/GeoIP1.dat",GEOIP_STANDARD);
    $country = geoip_country_code_by_addr($gi, $ip);
}
else {
    //ipv6
    $gi = geoip_open("/usr/share/GeoIP/GeoIPv6.dat",GEOIP_STANDARD);
    $country = geoip_country_code_by_addr_v6($gi, $ip);
}
echo $ip . "<br>" . $country;

这是专门针对国家/地区,但可以轻松复制到城市数据。