Dragon
主机之家测评主机之家测评  2019-08-21 15:40 主机之家测评 隐藏边栏 |   抢沙发  97 
文章评分 0 次,平均分 0.0

系统内置了 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 说明,进一步返回更友好的错误信息。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

发表评论

扫一扫二维码分享