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