php 獲取准確的ip,並通過ip准確獲取所在區域 的方法


本人qq群也有許多的技術文檔,希望可以為你提供一些幫助(非技術的勿加)。

QQ群:   281442983 (點擊鏈接加入群:http://jq.qq.com/?_wv=1027&k=29LoD19)    QQ:1542385235

 

  1. 騰訊的IP分享計划的查詢接口連接是:http://ip.qq.com/cgi-bin/searchip,該連接后面會帶有一個get參數searchip1,即searchip1=你要查詢的IP地址。采用PHP向http://ip.qq.com/cgi-bin/searchip發送http get request,然后獲取相應,獲得相應結果后,將結果用正則表達式將需要的地理位置信息提取出來就OK了。當然,PHP發送get請求的方法有很多,我用curl來模擬http請求的方法

  2. 2

    Curl是PHP的一個擴展,進行測試之前,先確認PHP已經加載了curl擴展。打開PHP配置文件php.ini,搜索 “extension=php_curl.dll”,將其前面的分號(;)去掉,然后重啟HTTP服務器,查看phpinfo(),若能看到curl的信 息,說明PHP擴展curl成功


/*
*根據騰訊IP分享計划的地址獲取IP所在地,比較精確
*/
public function getIPLoc_QQ($queryIP){
$url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP;
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_ENCODING ,'gb2312');
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 獲取數據返回
$result = curl_exec($ch);
$result = mb_convert_encoding($result, "utf-8", "gb2312"); // 編碼轉換,否則亂碼
curl_close($ch);
preg_match("@<span>(.*)</span></p>@iU",$result,$ipArray);
$loc = $ipArray[1];
return $loc;
}
  1. 新浪的IP查詢接口地址是:http://int.dpool.sina.com.cn/iplookup/iplookup.php,該連接后面也帶有get參數,參數ip=你要查詢的IP地址,format=返回的查詢結果格式。為了方便起見,返回的格式采用json,即format=json,因此,PHP出來擴展curl外,還得擴展json:

  2. 2

    /* 

     *根據新浪IP查詢接口獲取IP所在地 

     */ 

    function getIPLoc_sina($queryIP){ 

        $url = 'http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip='.$queryIP; 

        $ch = curl_init($url); 

        //curl_setopt($ch,CURLOPT_ENCODING ,'utf8'); 

        curl_setopt($ch, CURLOPT_TIMEOUT, 10); 

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 獲取數據返回 

        $location = curl_exec($ch); 

        $location = json_decode($location); 

        curl_close($ch); 

         

        $loc = ""; 

        if($location===FALSE) return ""; 

        if (emptyempty($location->desc)) { 

            $loc = $location->province.$location->city.$location->district.$location->isp; 

        }else{ 

            $loc = $location->desc; 

        } 

        return $loc; 

  3. 3

    使用getIPLoc_sina("183.37.209.57")即可得到IP地址所在的地址位置。

    當然,如果顯示的時候對每個IP地址都用上述函數查詢一次,會很慢很慢……最好是每來一個訪客訪問頁面的時候,就調用函數查詢其IP對應的地理位置,然后存入數據庫。等到顯示的時候直接從數據庫讀取就好了,這樣效率會高一些。

     


//獲取當前用戶ip
public function getip() {
$unknown = 'unknown';
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown)){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown)) {
$ip = $_SERVER['REMOTE_ADDR'];
}
/**
* 處理多層代理的情況
* 或者使用正則方式:$ip = preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : $unknown;
*/
if (false !== strpos($ip, ',')) $ip = reset(explode(',', $ip));
return $ip;
}

個人公眾號謝謝各位老鐵支持

本人qq群也有許多的技術文檔,希望可以為你提供一些幫助(非技術的勿加)。

QQ群:   281442983 (點擊鏈接加入群:http://jq.qq.com/?_wv=1027&k=29LoD19)    QQ:1542385235

 

我的淘寶店,可以進去逛逛噢:https://shop108912636.taobao.com/index.htm?spm=2013.1.w5001-7867000954.3.1d29318dPlLar7&scene=taobao_shop

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM