客戶端IP返回::1的解決辦法,及IP轉換整形(ip2long)
阿新 • • 發佈:2019-01-04
剛剛測試程式,一個功能要求獲取客戶端IP,然而在本機測試過程中發現,客戶端(本機)IP始終返回::1,獲取 IP 部份的程式碼如下:
$ip=ip2long($_SERVER['REMOTE_ADDR']);
PHP裡有這麼一個函式ip2long.比如
<?php
echo ip2long("10.2.1.3");//我們將得到167903491
?>
這是如何計算的,目前我知道有兩個演算法。其一
<?php
function ip2int($ip){
//我們先把ip分為四段,$ip1,$ip2,$ip3,$ip4
list($ip1,$ip2,$ip3 ,$ip4)=explode(".",$ip);
//然後第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256
//這即是我們得到的值
return $ip1*pow(256,3)+$ip2*pow(256,2)+$ip3*256+$ip4;
}
?>
把ip資料儲存在資料庫(MySQL)中時候,我們習慣用ip2long函式生成整型,然後存放在一個int(11)型別的欄位中,但是,在不同的系統平臺上,ip2long函式得到的值是不同的,因此可能造成在從資料庫中讀出資料,用long2ip得到ip的時候產生錯誤,說一下我們碰到的情況:
我們用一個int(11)型別(範圍-2147483648 - 2147483647)來儲存把一個ip地址用ip2long處理得到的結果,例如ip是’202.105.77.179′,那麼在32位機器上得到的結果是:-899068493,而在64位機器上卻得到3395898803.然後把它寫入資料庫,由於超過int(11)的範圍,因此64位機器上的結果被儲存為int(11)的最大值:2147483647.於是在從資料庫中取出的時候,便得到了錯誤的結果,會得到”127.255.255.255″這個ip地址.
今天在往資料庫裡插入IP時列印$_SERVER['REMOTE_ADDR']
::1
; 用到兩種方法,
1:我想應該是localhost引起的,於是檢視host對映,(Host對映檢視方法 C:\Windows\System32\drivers\etc 檔案hosts);刪除
::1 localhost
仍然不管用。 2:自己百度看到這個問題:我的php獲取的本地ip地址是::1 ?
最佳答案是
::1
說明你的電腦開啟了ipv6支援,這是ipv6下的本地迴環地址的表示。 因為你訪問的時候用的是
localhost
訪問的,是正常情況。 使用ip地址訪問或者關閉ipv6支援都可以不顯示這個。
後來我又嘗試關閉ipv6,仍然顯示
::1