手册中,"其它基本扩展->GeoIP",有一个GeoIP扩展,今天我们来研究下这个扩展:
2.默认情况下,我们仅有免费的GeoIP 国家和 GeoLite城市数据库的访问权限。想使用其它类型的数据库,得需要购买商业协议。(www.maxmind.com)
3.有人评论说,免费的GeoLite数据库,仅仅是精度上比商业版低点,但对于我们大多数的项目已经足够了。我们使用免费的就行
运行时配置:
geoip.custom_directory // 自定义geoIP的数据库路径
默认值是 "",使用的是编译时制定的路径,可以设置此配置,强制使用另一个不同的数据库路径
可能会出现的一个错误是:
PHP GeoIP: Required database not available at /usr/share/GeoIP/GeoIP.dat,未找到GeoIP.dat文件,我们可以下载它:
cd /usr/share/GeoIP/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz
这样就可以了,不需要重启任何服务
反正大家得知道,geoip就是通过ip地址来查找其它信息:
安装了geoip库
还得下载 '.dat' 数据库,基本所有函数,都得从数据库中查找
咱们一般使用的是免费版,好多功能可能没
获取IP地址关联的ASN(Autonomous System Numbers)
自治系统号,可查看知乎的问题:什么是 Autonomous System Number(自治系统号),这个东西怎么玩?地址:https://www.zhihu.com/question/21024981,有个大概理解就行了
1.$hostname
主机名或IP地址
2.返回值
成功返回ASN,在数据库中未发现此地址,返回false
3.实例:
echo geoip_asnum_by_name('www.baidu.com'); // ...
geoip_continent_code_by_name(string $hostname)
返回主机名或ip地址,对应的2个字母表示的 '洲码'(世界上有7大洲)
1.$hostname
查找的主机名或ip地址
2.返回值
成功返回 '洲码',数据库中未找到此地址,返回false
'洲码' 列表:
AF - Africa
AN - Antarctica
AS - Asia
EU - Europe
NA - Norce America
OC - Oceania
SA - Source America
geoip_country_code_by_name(string $hostname)
返回主机名或ip地址,对应的2个字母表示的 '国家码'
1.$hostname
查找的主机名或ip地址
2.返回值
成功返回2个字母表示的ISO国家码,在数据库中未发现此地址,返回false
// CN - China
完整的国家码列表,可查看:
ISO Country Code - 标准国家码(http://blog.csdn.net/beyond__devil/article/details/52837777)
geoip_country_code3_by_name(string $hostname) // 获取3个字母表示的ISO国家码。例如:USA
geoip_country_name_by_name(string $hostname) // 获取完整的国家名。例如:China
geoip_database_info([int $database = GEOIP_COUNTRY_EDITION])
返回二进制文件中,定义的相应 GeoIP 数据库版本,如果调用函数时,未传递参数,返回 GeoIP Free Country 版本
1.$database
数据库类型,是个整型。可查看常量列表,GEOIP_*_EDITION 系列常量
2.返回值
成功返回相应的数据版本,错误返回NULL
geoip_db_avail(int $database)
检查 GeoIP 数据库是否有效,并且在硬盘上是可以打开的。
It does not indicate if the file is a proper database, only if it is readable.
1.$database
数据库类型,是个整型。可查看常量列表,GEOIP_*_EDITION 系列常量
2.返回值
数据库存在,返回true,不存在返回false,错误返回null
geoip_db_filename(int $database)
返回相应的 GeoIP 数据库文件名
It does not indicate if the file exists or not on disk, only where the library is looking for the database.
1.$database
数据库类型,是个整型。可查看常量列表,GEOIP_*_EDITION 系列常量
2.返回值
成功返回相应的数据库文件名,错误返回NULL
3.实例:
echo geoip_db_filename(GEOIP_COUNTRY_EDITION); // /usr/share/GeoIP/GeoIP.dat
geoip_db_get_all_info()
返回所有 GeoIP 数据库类型的详细信息,返回的是一个多维数组。
即使没有数据库被安装,该函数也是可用的。它将仅仅列出它们,显示不可用
返回的关联数组的下标列表如下:
available - boolean类型,表明数据库是否可用(查看 geoip_db_avail())
description - 数据库描述
filename - 硬盘上数据库文件名(查看 geoip_db_filename())
实例:
输出:
有一点,需注意下:
最外层数组的索引下标,表示的是不同的数据库类型常量。
geoip_domain_by_name(string $hostname)
返回关联的主机名或IP地址的二级域名
该函数目前仅对商业'GeoIP Domain Edition'有效,如果发现对应的数据库不存在,则显示一个警告
1.$hostname
查找的主机名或ip地址
2.返回值
成功返回相应的域名,在数据库中未发现地址,返回false
geoip_id_by_name(string $hostname)
返回对应的主机名或IP地址的因特网连接类型
返回值是数字,是下面常量中的一个:
GEOIP_UNKNOWN_SPEED
GEOIP_DIALUP_SPEED
GEOIP_CABLEDSL_SPEED
GEOIP_CORPORATE_SPEED
1.$hostname
查找的主机名或IP地址
2.返回值
返回连接类型
3.手册上实例:
geoip_isp_by_name(string $hostname) // 获取对应的主机名或IP地址的ISP(Internet Service Provider-网络运营商)名字
geoip_netspeedcell_by_name(string $hostname)
返回主机名或IP地址对应的因特网连接类型和连接速度
该函数只能用于 GeoIP库 1.4.8以后
该函数目前仅对购买了商业 "GeoIP NetSpeedCell Edition" 的用户有效,如果发现对应的数据库不存在,则显示一个警告
返回一个字符串,常见的值是:
Cable/DSL
Dialup
Cellular
Corporate
1.$hostname
查找的主机名或IP地址
2.返回值
成功返回连接speed,如果在数据库中未找到地址,返回false
geoip_org_by_name(string $hostname)
返回主机名或IP地址,对应的组织名。
该函数目前仅对购买了商业 "GeoIP Organization, ISP or AS Edition" 的用户有效,如果发现对应的数据库不存在,则显示一个警告
1.$hostname
查找的主机名或IP地址
2.返回值
成功返回组织名,如果在数据库中未找到地址,返回false
geoip_record_by_name(string $hostname)
返回主机名或IP地址对应的在 GeoIP 数据库中的详细的城市信息
该函数对 'GeoLite City Edition' 和 商业'GeoIP City Edition' 都是有效的,如果发现对应的数据库不存在,则显示一个警告。
返回的关联数组的下标列表如下:
continent_code - 2个字母的 '洲码'
country_code - 2个字母的 '国家码'(查看 geoip_country_code_by_name())
country_code3 - 3个字母的 '国家码'(查看 geoip_country_code3_by_name())
country_name - 国家名(查看 geoip_country_name_by_name())
region - 地区码(例如:CA-California)
city - 城市
postal_code - 邮编,FSA或Zip码
latitude - 经度
longtitude - 纬度
dma_code - Designated Market Area code(仅仅美国和加拿大)
area_code - PSTN 区域码(例如:212)
geoip_region_by_name(string $hostname)
返回主机名或IP地址对应的国家和地区。
该函数目前仅对购买了商业 "GeoIP Region Edition" 的用户有效,如果发现对应的数据库不存在,则显示一个警告
返回的关联数组的下标列表如下:
country_code - 2个字母的 '国家码'(查看 geoip_country_code_by_name())
region - 地区码(例如:CA-California)
geoip_region_name_by_code(string $country_code, string $region_code)
根据国家码和地区码组合,获取地区名
在美国,地区码对应每个州的2个字母缩写。在加拿大,地区码对应2个字母的省份或区域码,由加拿大邮政制定的
对于世界上的其它国家,GeoIP 使用 FIPS 10-4 编码代表地区。可查看完整的列表: http://geolite.maxmind.com/download/geoip/misc/region_codes.csv
GeoIP扩展库自1.4.1以后,该函数都是有效的,数据的获取是直接来自 GeoIP扩展库,而不是从任何数据库中获取
1.$country_code
2个字母的国家码(查看 geoip_country_code_by_name())
2.$region_code
2个字母(或数字)的地区码(查看 geoip_region_by_name())
3.返回值
成功返回地区名,如果国家码和地区码组合未找到,返回false
4.实例:
美国/加拿大
echo geoip_region_name_by_code('CA', 'QC'); // Quebec
日本 - (原谅我,手册中的实例是日本,我暂未测试)
geoip_region_name_by_code('JP', '01'); // Aichi
中国 - 测试了哈
geoip_region_name_by_code('CN', '01'); // Anhui
geoip_time_zone_by_country_and_region(string $country_code[, string $region_code]) // 根据国家码和地区码组合,返回对应的时区
1.$country_code
2个字母的国家码(查看 geoip_country_code_by_name())
2.$region_code
2个字母(或数字)的地区码(查看 geoip_region_by_name())
3.返回值
成功返回时区,如果国家码和地区码组合未找到,返回false
4.实例:
geoip_region_name_by_code('CN', '23'); // Asia/Shanghai(23-表示上海)
geoip_setup_custom_directory(string $path)
改变 GeoIP 数据库的默认目录,等同于改变 'getip.custom_directory' 的配置
1.$path
硬盘上 GeoIP 数据库的全路径
2.实例:
简介:
GeoIP扩展允许你查找IP地址的位置。可以借助GeoIP获取:城市,州,国家,经度,纬度,以及其它信息,例如:ISP(网络服务提供商)和链接类型安装/配置:
1.GeoIP扩展需要1.4.0以上的GeoIP C语言 库,我们需要获取,并自己编译安装。2.默认情况下,我们仅有免费的GeoIP 国家和 GeoLite城市数据库的访问权限。想使用其它类型的数据库,得需要购买商业协议。(www.maxmind.com)
3.有人评论说,免费的GeoLite数据库,仅仅是精度上比商业版低点,但对于我们大多数的项目已经足够了。我们使用免费的就行
运行时配置:
geoip.custom_directory // 自定义geoIP的数据库路径
默认值是 "",使用的是编译时制定的路径,可以设置此配置,强制使用另一个不同的数据库路径
可能会出现的一个错误是:
PHP GeoIP: Required database not available at /usr/share/GeoIP/GeoIP.dat,未找到GeoIP.dat文件,我们可以下载它:
cd /usr/share/GeoIP/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz
这样就可以了,不需要重启任何服务
安装:
暂无,我看了一篇文章找不到了,各种安装方式。。。反正大家得知道,geoip就是通过ip地址来查找其它信息:
安装了geoip库
还得下载 '.dat' 数据库,基本所有函数,都得从数据库中查找
咱们一般使用的是免费版,好多功能可能没
函数:
geoip_asnum_by_name(string $hostname)获取IP地址关联的ASN(Autonomous System Numbers)
自治系统号,可查看知乎的问题:什么是 Autonomous System Number(自治系统号),这个东西怎么玩?地址:https://www.zhihu.com/question/21024981,有个大概理解就行了
1.$hostname
主机名或IP地址
2.返回值
成功返回ASN,在数据库中未发现此地址,返回false
3.实例:
echo geoip_asnum_by_name('www.baidu.com'); // ...
geoip_continent_code_by_name(string $hostname)
返回主机名或ip地址,对应的2个字母表示的 '洲码'(世界上有7大洲)
1.$hostname
查找的主机名或ip地址
2.返回值
成功返回 '洲码',数据库中未找到此地址,返回false
'洲码' 列表:
AF - Africa
AN - Antarctica
AS - Asia
EU - Europe
NA - Norce America
OC - Oceania
SA - Source America
geoip_country_code_by_name(string $hostname)
返回主机名或ip地址,对应的2个字母表示的 '国家码'
1.$hostname
查找的主机名或ip地址
2.返回值
成功返回2个字母表示的ISO国家码,在数据库中未发现此地址,返回false
// CN - China
完整的国家码列表,可查看:
ISO Country Code - 标准国家码(http://blog.csdn.net/beyond__devil/article/details/52837777)
geoip_country_code3_by_name(string $hostname) // 获取3个字母表示的ISO国家码。例如:USA
geoip_country_name_by_name(string $hostname) // 获取完整的国家名。例如:China
geoip_database_info([int $database = GEOIP_COUNTRY_EDITION])
返回二进制文件中,定义的相应 GeoIP 数据库版本,如果调用函数时,未传递参数,返回 GeoIP Free Country 版本
1.$database
数据库类型,是个整型。可查看常量列表,GEOIP_*_EDITION 系列常量
2.返回值
成功返回相应的数据版本,错误返回NULL
geoip_db_avail(int $database)
检查 GeoIP 数据库是否有效,并且在硬盘上是可以打开的。
It does not indicate if the file is a proper database, only if it is readable.
1.$database
数据库类型,是个整型。可查看常量列表,GEOIP_*_EDITION 系列常量
2.返回值
数据库存在,返回true,不存在返回false,错误返回null
geoip_db_filename(int $database)
返回相应的 GeoIP 数据库文件名
It does not indicate if the file exists or not on disk, only where the library is looking for the database.
1.$database
数据库类型,是个整型。可查看常量列表,GEOIP_*_EDITION 系列常量
2.返回值
成功返回相应的数据库文件名,错误返回NULL
3.实例:
echo geoip_db_filename(GEOIP_COUNTRY_EDITION); // /usr/share/GeoIP/GeoIP.dat
geoip_db_get_all_info()
返回所有 GeoIP 数据库类型的详细信息,返回的是一个多维数组。
即使没有数据库被安装,该函数也是可用的。它将仅仅列出它们,显示不可用
返回的关联数组的下标列表如下:
available - boolean类型,表明数据库是否可用(查看 geoip_db_avail())
description - 数据库描述
filename - 硬盘上数据库文件名(查看 geoip_db_filename())
实例:
<?php
$infos = geoip_db_get_all_info();
if (is_array($infos)) {
var_dump($infos);
}
?>
输出:
array(11) {
[1]=>
array(3) {
["available"]=>
bool(true)
["description"]=>
string(21) "GeoIP Country Edition"
["filename"]=>
string(32) "/usr/share/GeoIP/GeoIP.dat"
}
[ ... ]
[11]=>
array(3) {
["available"]=>
bool(false)
["description"]=>
string(25) "GeoIP Domain Name Edition"
["filename"]=>
string(38) "/usr/share/GeoIP/GeoIPDomain.dat"
}
}
有一点,需注意下:
最外层数组的索引下标,表示的是不同的数据库类型常量。
geoip_domain_by_name(string $hostname)
返回关联的主机名或IP地址的二级域名
该函数目前仅对商业'GeoIP Domain Edition'有效,如果发现对应的数据库不存在,则显示一个警告
1.$hostname
查找的主机名或ip地址
2.返回值
成功返回相应的域名,在数据库中未发现地址,返回false
geoip_id_by_name(string $hostname)
返回对应的主机名或IP地址的因特网连接类型
返回值是数字,是下面常量中的一个:
GEOIP_UNKNOWN_SPEED
GEOIP_DIALUP_SPEED
GEOIP_CABLEDSL_SPEED
GEOIP_CORPORATE_SPEED
1.$hostname
查找的主机名或IP地址
2.返回值
返回连接类型
3.手册上实例:
<?php
$netspeed = geoip_id_by_name('www.example.com');
echo 'The connection type is ';
switch ($netspeed) {
case GEOIP_DIALUP_SPEED:
echo 'dial-up';
break;
case GEOIP_CABLEDSL_SPEED:
echo 'cable or DSL';
break;
case GEOIP_CORPORATE_SPEED:
echo 'corporate';
break;
case GEOIP_UNKNOWN_SPEED:
default:
echo 'unknown';
}
?>
geoip_isp_by_name(string $hostname) // 获取对应的主机名或IP地址的ISP(Internet Service Provider-网络运营商)名字
geoip_netspeedcell_by_name(string $hostname)
返回主机名或IP地址对应的因特网连接类型和连接速度
该函数只能用于 GeoIP库 1.4.8以后
该函数目前仅对购买了商业 "GeoIP NetSpeedCell Edition" 的用户有效,如果发现对应的数据库不存在,则显示一个警告
返回一个字符串,常见的值是:
Cable/DSL
Dialup
Cellular
Corporate
1.$hostname
查找的主机名或IP地址
2.返回值
成功返回连接speed,如果在数据库中未找到地址,返回false
geoip_org_by_name(string $hostname)
返回主机名或IP地址,对应的组织名。
该函数目前仅对购买了商业 "GeoIP Organization, ISP or AS Edition" 的用户有效,如果发现对应的数据库不存在,则显示一个警告
1.$hostname
查找的主机名或IP地址
2.返回值
成功返回组织名,如果在数据库中未找到地址,返回false
geoip_record_by_name(string $hostname)
返回主机名或IP地址对应的在 GeoIP 数据库中的详细的城市信息
该函数对 'GeoLite City Edition' 和 商业'GeoIP City Edition' 都是有效的,如果发现对应的数据库不存在,则显示一个警告。
返回的关联数组的下标列表如下:
continent_code - 2个字母的 '洲码'
country_code - 2个字母的 '国家码'(查看 geoip_country_code_by_name())
country_code3 - 3个字母的 '国家码'(查看 geoip_country_code3_by_name())
country_name - 国家名(查看 geoip_country_name_by_name())
region - 地区码(例如:CA-California)
city - 城市
postal_code - 邮编,FSA或Zip码
latitude - 经度
longtitude - 纬度
dma_code - Designated Market Area code(仅仅美国和加拿大)
area_code - PSTN 区域码(例如:212)
geoip_region_by_name(string $hostname)
返回主机名或IP地址对应的国家和地区。
该函数目前仅对购买了商业 "GeoIP Region Edition" 的用户有效,如果发现对应的数据库不存在,则显示一个警告
返回的关联数组的下标列表如下:
country_code - 2个字母的 '国家码'(查看 geoip_country_code_by_name())
region - 地区码(例如:CA-California)
geoip_region_name_by_code(string $country_code, string $region_code)
根据国家码和地区码组合,获取地区名
在美国,地区码对应每个州的2个字母缩写。在加拿大,地区码对应2个字母的省份或区域码,由加拿大邮政制定的
对于世界上的其它国家,GeoIP 使用 FIPS 10-4 编码代表地区。可查看完整的列表: http://geolite.maxmind.com/download/geoip/misc/region_codes.csv
GeoIP扩展库自1.4.1以后,该函数都是有效的,数据的获取是直接来自 GeoIP扩展库,而不是从任何数据库中获取
1.$country_code
2个字母的国家码(查看 geoip_country_code_by_name())
2.$region_code
2个字母(或数字)的地区码(查看 geoip_region_by_name())
3.返回值
成功返回地区名,如果国家码和地区码组合未找到,返回false
4.实例:
美国/加拿大
echo geoip_region_name_by_code('CA', 'QC'); // Quebec
日本 - (原谅我,手册中的实例是日本,我暂未测试)
geoip_region_name_by_code('JP', '01'); // Aichi
中国 - 测试了哈
geoip_region_name_by_code('CN', '01'); // Anhui
geoip_time_zone_by_country_and_region(string $country_code[, string $region_code]) // 根据国家码和地区码组合,返回对应的时区
1.$country_code
2个字母的国家码(查看 geoip_country_code_by_name())
2.$region_code
2个字母(或数字)的地区码(查看 geoip_region_by_name())
3.返回值
成功返回时区,如果国家码和地区码组合未找到,返回false
4.实例:
geoip_region_name_by_code('CN', '23'); // Asia/Shanghai(23-表示上海)
geoip_setup_custom_directory(string $path)
改变 GeoIP 数据库的默认目录,等同于改变 'getip.custom_directory' 的配置
1.$path
硬盘上 GeoIP 数据库的全路径
2.实例:
<?php
geoip_setup_custom_directory('/some/other/path'); // 改变路径
print geoip_db_filename(GEOIP_COUNTRY_EDITION); // 输出:/some/other/path/GeoIP.dat
?>