系统内置了 get_client_ip 方法用于获取客户端的 IP 地址,使用示例:
$ip = get_client_ip();
上面的方法会返回一个客户端 IP 地址,但是如果要根据 IP 定位功能,则需要配合 IP 地址库文件(详见:http://www.kancloud.cn/manual/thinkphp/1885),网上下的 IP 地址库都不是很全面,因此我采用了使用第三方 API 获取 IP 定位信息的方法,这里选用的是百度 API 集市中的一个免费 IP 地址查询 API(详见:http://apistore.baidu.com/apiworks/servicedetail/114.html)。
具体实现方法:
/** *百度API集市 IP地址查询 http://apistore.baidu.com/apiworks/servicedetail/114.html *@param $ip string *@return string **/ function getIpInfo($ip){ $ch = curl_init(); $url = 'http://apis.baidu.com/apistore/iplookupservice/iplookup?ip='.$ip; $header = array( 'apikey:'.'你的apikey', ); // 添加apikey到header curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 执行HTTP请求 curl_setopt($ch, CURLOPT_URL, $url); $res = curl_exec($ch); $arr = (array)json_decode($res,true); if($arr['errNum']==0){ $ip=$arr['retData']['ip']; $country=$arr['retData']['country']; $provice=$arr['retData']['provice']=='None'?'':$arr['retData']['provice']; $city=$arr['retData']['city']=='None'?'':$arr['retData']['city']; $district=$arr['retData']['district']=='None'?'':$arr['retData']['district']; $carrier=$arr['retData']['carrier']=='未知'?'':$arr['retData']['carrier']; eturn($country.' '.$provice.' '.$city.' '.$district.' '.$carrier.' '.$ip); } else{ return($arr['errMsg']); }
在需要 ip 定位的地方调用这个方法,传入通过 get_client_ip 方法获取的 ip 即可,成功则返回详细 ip 定位信息,失败则返回错误代码,也可以根据 API 说明,进一步返回更友好的错误信息。
声明:1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。







