PHP如何獲取訪問者的IP地址和歸屬地方式詳解
一、什么是IP地址
IP地址是互聯(lián)網(wǎng)協(xié)議(IP協(xié)議)定義的一種用于標(biāo)識網(wǎng)絡(luò)上主機(計算機或其他設(shè)備)的地址。它是一個由四個數(shù)字組成的標(biāo)識符,每個數(shù)字范圍是0到255,以點分隔開。IP地址用于在互聯(lián)網(wǎng)上進(jìn)行通信和傳輸數(shù)據(jù),類似于人類使用的郵政地址。它可以用來確定一個設(shè)備在網(wǎng)絡(luò)中的位置,以便其他設(shè)備能夠準(zhǔn)確地發(fā)送數(shù)據(jù)到該設(shè)備。 IP地址分為IPv4和IPv6兩個版本。IPv4是目前廣泛使用的版本,采用32位地址格式。而IPv6是較新的版本,采用128位地址格式,為了應(yīng)對互聯(lián)網(wǎng)用戶數(shù)量的增長而設(shè)計。
我們常用的IP4地址如:8.8.8.8,114.114.114.114(等類似由4組數(shù)字組成的網(wǎng)絡(luò)地址)。本地IP地址如:192.168.0.1,127.0.0.1等。
二、PHP如何獲取IP地址
PHP直接獲取訪問者IP地址:
$ip=$_SERVER["REMOTE_ADDR"];//訪問者IP
這里我們可以通過系統(tǒng)變量$_SERVER["REMOTE_ADDR"]取得訪問者的IP地址并存入自定義變量$ip。方便后續(xù)代碼引用。當(dāng)然這里是通過PHP直接獲取用戶的IP地址,如果用戶使用了代理服務(wù)器,這該IP地址就是代理服務(wù)器的IP地址,而非用戶的真實IP地址。
如果需要獲取用戶的真實IP地址,可以嘗試使用$_SERVER['HTTP_X_FORWARDED_FOR']。但是,這個值不是所有的代理服務(wù)器都會設(shè)置,所以結(jié)果可能為空或者不準(zhǔn)確。如果需要準(zhǔn)確獲取用戶的真實IP地址,可以使用一些第三方的庫或服務(wù)。
三、獲取IP地址的歸屬地
我們無法通過PHP直接獲得IP地址的歸屬地,但是我們可以利用本地IP庫(離線下載)或者在線IP庫對IP地址進(jìn)行匹配。如果該IP地址在IP庫或者該IP特征進(jìn)行匹配即可獲得歸屬地。
1、百度在線API接查詢
$ip=$_SERVER["REMOTE_ADDR"]; $ak='**********';//這里需要你自己申請并獲取$ipurl='https://api.map.baidu.com/location/ip?ak='.$ak.'&ip='.$ip; //GET請求 $fh= file_get_contents("$ipurl"); $jsonarr = json_decode($fh, true); if($jsonarr['status'] == 0) { $result = $jsonarr['content']; $result = $result['address_detail']; $froms='中國-'.$result['province'].'-'.$result['city']; }else{ echo "未能查詢到".$ip."的歸屬地"; }
這里是通過百度api的IP查詢接口進(jìn)行查詢的。網(wǎng)絡(luò)很多代碼通過淘寶IP庫查詢,但是我發(fā)現(xiàn)淘寶IP庫的api接口好像關(guān)閉了,不能正常使用了。
2、通過其他api接口查詢
$token = '*******'; // 用戶token ,登錄系統(tǒng)后可獲取到 $fh= file_get_contents("https://67ip.cn/check?ip=$ip&token=$token"); $jsonarr = json_decode($fh, true);; if($jsonarr['code']=='200'){ $result = $jsonarr['data']; if($result['city']=='0'){ $result['city']='未知'; } if($result['service']=='0'){ $result['service']=''; } $froms=$result['country'].'-'.$result['city'].'-'.$result['service']; }else{ $froms='火星'; }
本文介紹的都是通過api接口進(jìn)行查詢,為什么不介紹本地IP庫進(jìn)行查詢呢?主要是本人沒有獲取到本地IP庫的數(shù)據(jù)文件,不知道本地IP庫的格式,無法完成有效的對應(yīng)的代碼,如果誰有本地IP庫可以分享我一份,謝謝。不過我們可以舉個例子來完成。
3、本地IP庫獲取歸屬地
假設(shè)我本地IP庫的地址數(shù)據(jù)內(nèi)容如下
文件名稱:ip.txt
192.168.0.1:路由器
192.168.0.2:老婆的電腦
192.168.0.3:兒子的ipad
192.168.0.4:老媽的手機
192.168.0.5:老爹的手機
118.118.118.188:本人的辦公電腦
...
我們可以通過IP匹配的方法獲得訪問者信息:
$visitorIp = $_SERVER['REMOTE_ADDR']; $ipDataFile = 'ip.txt'; // 讀取ip.txt文件中的數(shù)據(jù) $ipData = file_get_contents($ipDataFile); // 按行拆分?jǐn)?shù)據(jù) $ipRecords = explode("\n", $ipData); // 遍歷IP記錄,查找匹配的訪問者信息 foreach ($ipRecords as $record) { $parts = explode(":", $record); $ip = trim($parts[0]); $info = trim($parts[1]); // 匹配IP地址 if ($visitorIp === $ip) { echo "訪問者IP:".$visitorIp."<br>"; echo "訪問者信息:".$info; break; } }
以上就是PHP如何獲取訪問者的IP地址和歸屬地方式詳解的詳細(xì)內(nèi)容,更多關(guān)于PHP獲取IP地址歸屬地的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
thinkphp5?操作redis?實現(xiàn)文章的熱度排行和點贊排行的示例
本文主要介紹了thinkphp5?操作redis?實現(xiàn)文章的熱度排行和點贊排行的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04php實現(xiàn)mysql數(shù)據(jù)庫備份類
備份程序一共只有兩個類:數(shù)據(jù)庫備份器(DbBak)和表備份器(TableBak): 這個程序僅僅備份和恢復(fù)數(shù)據(jù),使用方法很簡單,實例化DbBak,然后調(diào)用bakupDb和restoreDb方法:2008-03-03使用一個for循環(huán)將N*N的二維數(shù)組的所有值置1實現(xiàn)方法
下面小編就為大家?guī)硪黄褂靡粋€for循環(huán)將N*N的二維數(shù)組的所有值置1實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05yii2中結(jié)合gridview如何使用modal彈窗實例代碼詳解
這篇文章主要介紹了yii2中如何結(jié)合gridview使用modal彈窗的相關(guān)資料,需要的朋友可以參考下2016-06-06