首頁 >後端開發 >php教程 >ip2long-long2ip

ip2long-long2ip

WBOY
WBOY原創
2016-07-29 09:14:452717瀏覽

一,需求原因

Ip位址轉換成整形存儲,對於資料庫最佳化來說是非常重要的。很多人把ip位址當作字串類型來存儲,當資料量龐大的時候,會很嚴重的消耗資源。而且,整形的索引速度要遠大於字符串的索引,所以就要用到ip轉整形存儲,使用時再將整形轉回ip。 php的ip轉換,這篇文章講解為ipv4,ipv6不做講解。

二,系統內建函數

Ip轉換整形用到的函數是:ip2long

例:

$ip=” 60.6.205.138”;

echo ip2long($ip);

,常見的問題


1. 當ip位址比較大時,轉換後的整數會有超過最大整形範圍的情況。有符號整數最大值2147483647,當超過這個值就會變成負數。

    解決方法:寫成$ip = bindec(decbin(ip2long($ip)));    例:

$ip=”60.6.205.138”;

$ipInt=ip2long($ip);

echo long2ip($ipInt);

說明:decbin函數將十進位轉換為二進位,bindec 將二進位轉換為二進位。

2. 當一些ip位址有前綴0時,轉換就會出錯。

    例:

$ip = "192.168.10.1":

$ip= bindec(decbin(ip2long($ip)));

echo $ip;

當ip轉換為整形後,再轉回ip時就會出錯,ip位址與原來不符。原因為有前導0.

解決方法:

第一,因為ip轉換整形是以:第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256、最後總和得出的結果。

$ip = '021.110.11.49';

$ip_int = ip2long($ip);

echo $ip."<br />";

echo $ip_int."<br />";

echo long2ip($ip_int);

說明:



intval把變數轉換為整數型別

pow(4,2)回傳16,傳回x的y次方pow(4,2)回傳16,回傳x的y次方

,透過位元運算子解決。

$ip = '060.06.205.138';

function ipToInt($ip){

$iparr = explode('.',$ip);

$num = 0;

for($i=0;$i<count($iparr);$i++){

$num += intval($iparr[$i]) *pow(256,count($iparr)-($i+1));

}

return $num;

}

echo $ip.'<br />';

位運算子演算法簡單說就是,左移三位把目前數乘以2的三次方,左移兩位乘以2的平方。右移運算是將一個二進位位的運算元依指定移動的位數向右移動,移出位元被丟棄,左邊移出的空位或一律補0,或補符號位,這由不同的機器而定。

如果大家不懂,就按第一種方法來。

文章到此就結束了,如果大家有問題可以留言我們一起討論。希望大家多動手練練,好加深印象,我們一起加油!


以上就介紹了ip2long-long2ip,包含了方面的內容,希望對PHP教程有興趣的朋友有幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn