一,需求原因
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);
例:
$ip = "192.168.10.1": $ip= bindec(decbin(ip2long($ip))); echo $ip;
第一,因為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,或補符號位,這由不同的機器而定。
如果大家不懂,就按第一種方法來。
文章到此就結束了,如果大家有問題可以留言我們一起討論。希望大家多動手練練,好加深印象,我們一起加油!