PHP程序查询IP地址归属地的方法

  •   
  • 4222
  • PHP
  • 5
  • super_dodo
  • 2013/11/19

程序中查询一个IP地址的归属地信息,方法有很多种。概括起来有两类:

1. 调用某些网站提供的web api接口

好处是显而易见的,使用便捷,开发成本低,自己不需要维护IP地址信息库。坏处也很明显,受制于人,服务说停就停。

2. 自己编程,查询本地的IP地址信息库

这种方式完全自主,使用起来没有任何限制。不过需要自己维护IP地址信息库,起码每年更新几次还是有必要的。国内最常用的IP地址信息库就是纯真IP地址信息库了。
下载网站1:http://www.cz88.net 下载网站2:http://www.crsky.com/soft/2611.html

需要注意的是,虽然php可以直接访问qqwry.dat文件进行查询,但是如果查询比较频繁的话,建议还是采用使用C编写成的qqwry.so这样的php扩展模块效率更高。在Linux下很容易进行安装。具体可以参照http://www.open-open.com/lib/view/open1334717267889.html

还有一种做法是使用数据库维护一个IP地址信息库。难点主要是如果拿到一份正确的数据库(去淘宝上买?哪里有官方的?)以及从哪里获取IP信息的更新。

对于小规模应用,最便捷的做法显然是调用新浪,淘宝等现成的接口。大不了把几个接口都写到程序里,一个接口失败了,就尝试调用另外一个接口,这样应该能大大增强程序的可靠性。

本想整理一下各种接口的调用,发现网上已经有人整理的很好了,直接引用了:

//获取当前用户的ip
$ip = $_SERVER['REMOTE_ADDR']; 
echo "您的IP地址: $ip <br/><br/>";
 
echo " 例子1:调用新浪接口获取客户端IP地址信息<br/>";
echo "============================<br/>";
$url = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=".$ip;
$result = file_get_contents($url); 
//var_dump(json_decode($result));
 
$ip_info = json_decode($result);
echo "ret: " . $ip_info->ret . "<br />";
echo "start: " . $ip_info->start . "<br />";
echo "end: " . $ip_info->end . "<br />";
echo "country: " . $ip_info->country . "<br />";
echo "province: " . $ip_info->province . "<br />";
echo "city: " . $ip_info->city . "<br />";
echo "district: " . $ip_info->district . "<br />";
echo "isp: " . $ip_info->isp . "<br />";
echo "desc: " . $ip_info->desc . "<br />";
echo "============================<br/>";
 
echo "<br/>";
echo "例子2:调用淘宝接口获取客户端IP地址信息<br/>";
echo "============================<br/>";
$url = "http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;
$result = file_get_contents($url); 
//var_dump(json_decode($result));
 
$ip_info = json_decode($result);
if((string)$ip_info->code=='0'){
        $info = $ip_info->data;
        echo "country: " . $info->country . "<br />";
        echo "country_id: " . $info->country_id  ."<br />";
        echo "area: " . $info->area . "<br />";
        echo "area_id: " . $info->area_id . "<br />";
        echo "region: " . $info->region . "<br />";
        echo "region_id: " . $info->region_id  . "<br />";
        echo "city: " . $info->city . "<br />";
        echo "city_id: " . $info->city_id . "<br />";
        echo "county: " . $info->county . "<br />";
        echo "county_id: " . $info->county_id . "<br />";
        echo "isp: " . $info->isp . "<br />";
        echo "isp_id: " . $info->isp_id . "<br />";
        echo "ip: " . $info->ip . "<br />";
}
echo "============================<br/>";
 
echo "<br/>";
echo " 例子3:查询本地qqwry.dat文件<br/>";
echo "============================<br/>";
// 调用查询qqwry.dat的函数
$ip_info = query_qqwry($ip);
// 注意:qqwry文字编码位GB2312,这里转成UTF-8格式
$ip_info = iconv("GB2312","UTF-8",$ip_info) ;
echo "IP地址数据库(QQIP地址)V2013.08.25纯真版:" . $ip_info . "<br/>";
echo "============================<br/>";
echo "灰常抱歉,该方法因为需要更新数据信息,个人认为实用性不大.请参考原文.";

php调用这些接口的执行效果:http://www.tudaxia.com/demo/get_ip_info.php

原文地址:http://www.tudaxia.com/archives/617