PHP如何獲取訪問者的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)分隔開。IP地址用于在互聯(lián)網(wǎng)上進(jìn)行通信和傳輸數(shù)據(jù),類似于人類使用的郵政地址。它可以用來確定一個(gè)設(shè)備在網(wǎng)絡(luò)中的位置,以便其他設(shè)備能夠準(zhǔn)確地發(fā)送數(shù)據(jù)到該設(shè)備。 IP地址分為IPv4和IPv6兩個(gè)版本。IPv4是目前廣泛使用的版本,采用32位地址格式。而IPv6是較新的版本,采用128位地址格式,為了應(yīng)對互聯(lián)網(wǎng)用戶數(shù)量的增長而設(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直接獲取訪問者IP地址:
$ip=$_SERVER["REMOTE_ADDR"];//訪問者IP
這里我們可以通過系統(tǒng)變量$_SERVER["REMOTE_ADDR"]取得訪問者的IP地址并存入自定義變量$ip。方便后續(xù)代碼引用。當(dāng)然這里是通過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地址,可以使用一些第三方的庫或服務(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庫可以分享我一份,謝謝。不過我們可以舉個(gè)例子來完成。
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:老媽的手機(jī)
192.168.0.5:老爹的手機(jī)
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)文章
php根據(jù)身份證號(hào)碼計(jì)算年齡的實(shí)例代碼
我們只要知道身份證的生成規(guī)則就可以了,像下面我們從指定位置到多少位就是出日期了,然后我們把日期轉(zhuǎn)成時(shí)間戳然后進(jìn)行加減運(yùn)算就得出了年齡了,下面我們看實(shí)例2014-01-01
PHP驗(yàn)證信用卡卡號(hào)是否正確函數(shù)
這篇文章主要介紹了PHP驗(yàn)證信用卡卡號(hào)是否正確函數(shù),本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-05-05
thinkphp5?操作redis?實(shí)現(xiàn)文章的熱度排行和點(diǎn)贊排行的示例
本文主要介紹了thinkphp5?操作redis?實(shí)現(xiàn)文章的熱度排行和點(diǎn)贊排行的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
PHP增刪改查項(xiàng)目的實(shí)戰(zhàn)詳解
這篇文章主要為大家詳細(xì)介紹了PHP增刪改查項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
php實(shí)現(xiàn)mysql數(shù)據(jù)庫備份類
備份程序一共只有兩個(gè)類:數(shù)據(jù)庫備份器(DbBak)和表備份器(TableBak): 這個(gè)程序僅僅備份和恢復(fù)數(shù)據(jù),使用方法很簡單,實(shí)例化DbBak,然后調(diào)用bakupDb和restoreDb方法:2008-03-03
使用一個(gè)for循環(huán)將N*N的二維數(shù)組的所有值置1實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄褂靡粋€(gè)for循環(huán)將N*N的二維數(shù)組的所有值置1實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
yii2中結(jié)合gridview如何使用modal彈窗實(shí)例代碼詳解
這篇文章主要介紹了yii2中如何結(jié)合gridview使用modal彈窗的相關(guān)資料,需要的朋友可以參考下2016-06-06

