使用 php5-geoip 和 Maxmind 数据库获得 IPv6 支持
Getting IPv6 support with php5-geoip and Maxmind database
我按照这些相同的步骤设置了 geoip (http://php.net/manual/en/geoip.setup.php):
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 设备有多糟糕。例如,它 returns 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)
很好用。
- 我尝试通过 https://github.com/maxmind/geoip-api-php/blob/master/src/geoip.inc
中的 geoip.inc 文件包含缺失的函数
目前没有结果。
有什么方法可以让我在 PHP 代码 select 中轻松使用我想使用的数据库,以便我可以简单地测试它是 IPv4 还是 IPv6 地址并加载适当的数据库?
为了支持 IPv6->Country 代码,并且没有不必要的文件,基于上面的集成:
获取最新的旧版 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 目录 (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;
这是专门针对国家/地区的,但可以很容易地复制到城市数据。
我按照这些相同的步骤设置了 geoip (http://php.net/manual/en/geoip.setup.php):
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 设备有多糟糕。例如,它 returns 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)
很好用。
- 我尝试通过 https://github.com/maxmind/geoip-api-php/blob/master/src/geoip.inc 中的 geoip.inc 文件包含缺失的函数
目前没有结果。
有什么方法可以让我在 PHP 代码 select 中轻松使用我想使用的数据库,以便我可以简单地测试它是 IPv4 还是 IPv6 地址并加载适当的数据库?
为了支持 IPv6->Country 代码,并且没有不必要的文件,基于上面的集成:
获取最新的旧版 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 目录 (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;
这是专门针对国家/地区的,但可以很容易地复制到城市数据。