http - php有没有不使用第三方接口的情况下根据ip地址获取地理位置的方法?(第三方接口他们是通过什么原理实现这一功能的?)
回复内容:
我很好奇的是哪些根据ip获取地理位置的工具都是什么原理?ip中每位数字都代表了什么?我可以在本地不使用第三方接口的情况下完成这一任务吗?
什么是ISP呢?简单点理解就像是类似中国电信、联通、移动等网络供应商。
有了供应商了就可以上网了,上网你将能通过MODEM获取一个临时IP(周期性变化)。
但是这个IP是真的就随机给的吗?怎么随机的呢?
APNIC(亚太互联网络信息中心),就是这个组织了。是现在在世界中操作的五个地区的因特网登记处之一,分配B类IP地址的国际组织。它提供全球性的支持互联网操作的分派和注册服务。这些成员包括网络服务提供商、全国互联网登记, 和相似的组织的一个非营利, 基于会员资格的组织。APNIC 负责亚洲太平洋区域,包含 56 经济区。
假设,APNIC给中国分配了100万个IP地址。然后到国内,经由国内的*管理组织(不知道是谁)再分配给电信、移动、联通、移动等*ISP。然后这些ISP呢,再按照自己的规则给全国不同省份再分配,再到市、县、乡镇等。
IP地址每个数字并不代表什么,国内*ISP的IP分配是公开的,因此只有拿到这个库,才能根据用户的IP来知道用户是什么位置的由于这个库的更新并不及时,所以并不100%准确
update
国内比较流行的IP库就是纯真了。官网:http://www.cz88.net/ 右上角可以下载。安装后在目录下有个.dat
的文件就是IP分配数据库了。结合PHP的使用和其他语言的使用百度一搜就有。
PHP安装GeoIP扩展和数据库根据IP获取访客所在国家/城市/经纬度等信息
http://php.net/manual/zh/ref....sudo apt-get install libgeoip-dev
pecl install geoip-1.1.0
注意:Beta版要指定版本号.如果是apt安装的PHP,直接安装php5-geoip这个包即可.
php.ini中加入:
extension=geoip.so
geoip.custom_directory="/usr/share/GeoIP"
免费下载GeoLiteCity数据库(解压后18MB):
http://dev.maxmind.com/geoip/...
wget http://geolite.maxmind.com/do...
gunzip GeoLiteCity.dat.gz
sudo mkdir -v /usr/share/GeoIP
sudo mv -v GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat
测试:
php -a
AS
[country_code] => CN
[country_code3] => CHN
[country_name] => China //国家
[region] => 22
[city] => Beijing //城市
[postal_code] =>
[latitude] => 39.928901672363 //纬度
[longitude] => 116.38829803467 //经度
[dma_code] => 0
[area_code] => 0
)
PHP轻松实现"附近的人"功能,根据IP确定经纬度,根据经纬度计算距离
不使用第三方接口,也需要使用第三方提供的IP库进行匹配查询。
但是都不嫩达到100%的准确。
推荐一个既提供接口也提供IP库的服务商:http://www.ipip.net/
他们都有自己IP库的。除非你本地也有IP库
第三方接口能通过ip
获取地理位置信息, 其实是其本地保存了ip => address -info
的数据库映射, 因为他们的数据库里保存了大量的ip
和地理位置的关系, 所以才能为我们提供第三方服务
当然, 你完全可以自己去实现, 但是你可能没有那么庞大的数据库支持
你若还是不想请求第三方接口, 可以下载一个
免费的GeoIP数据库
这就是一个数据库的问题,这里有一个开源代码,自己去研究一下吧。http://git.oschina.net/lionsoul/ip2region
nginx+geo+fastcgi_params
欢迎phper加入hnphper群 233415606
pecl install qqwry-beta
qqwry 你值得拥有。
IP其实并非是胡乱划分的。有心的话,你会发现。IP段和所在的地区是紧密结合的。你的隔壁城市和你的城市的IP可能为连续的。
上一篇: php的设计模式是什么意思
下一篇: 分享常用的js方法合集