IP的獲取與轉換 1、前言 IP轉換成整型存儲是資料庫優化一大趨勢,字元串索引比整型索引消耗資源很多,特別是表中數據量大的時候,以及求查詢某一個ip段的數據。本文所指的IP是ip4,ip6暫不再討論範圍 2、ip4轉化為整形 這裡將介紹: php自帶函數 ip2long php原生模擬ip2long ...
IP的獲取與轉換
1、前言
IP轉換成整型存儲是資料庫優化一大趨勢,字元串索引比整型索引消耗資源很多,特別是表中數據量大的時候,以及求查詢某一個ip段的數據。本文所指的IP是ip4,ip6暫不再討論範圍
2、ip4轉化為整形
這裡將介紹:
- php自帶函數 ip2long
- php原生模擬ip2long的過程
2.1、ip2long
判斷一個 ip4 地址是不是合法的 ip,符合則返回一個長整型,不符合返回 false
以下是測試:
然而當 ip4 值較大時,ip2long轉化會出現負數的情況
2.2、php原生模擬ip2long的過程
php自帶的ip2long雖然好用,由於返回值是int,所以會造成數據溢出,比如有些ip地址轉換後變成負數,為了好看,還是需要自己模擬一個ip2long的過程,不多說,先上代碼
function ipToInt($ip) { $newHex = ''; $aIp = explode('.', $ip); //將ip分割成數組 foreach ($aIp as $key => $value) { //十進位最大值是255,超過是不合法的ip,直接返回 if($value > 255){ return ''; } $hex = dechex($value);//將十進位轉為十六進位 //每個ip段的值最大為255,十六進位為FF,故最長是兩位, //例IP = 1.1.1.1 如果不補0,則十六進位為 1111,十進位為 4369 //補0為 十六進位為 01010101,十進位為 16843009 if(strlen($hex) < 2) { $hex = '0'.$hex; //如果十六進位長度小於2,則自動補0 } $newHex .= $hex; } $int = hexdec($newHex);//十六進位轉為十進位 return $int; }
以下是測試:
3、將整形轉化為ip
這裡將介紹:
- php自帶函數 long2ip
- php原生模擬long2ip的過程
long2ip 只會返回0.0.0.0 到255.255.255.255的內容,
傳人空值預設返回0.0.0.0,超出最大值返回255.255.255.255
以下為測試:
long2ip可以識別由ip2long轉化產生的負數(可喜可賀);所有在使用過程中,ip2long和long2ip一起使用就不會有什麼問題,當然也要介紹一下如何用原生的模擬long2ip的過程
3.2、php原生模擬long2ip的過程
php自帶的long2ip已經可以解決大部分問題,這裡也只是簡單介紹一下原生的模擬方法,不多說,先上代碼
function intToIp($int) { //FFFFFF最大為4294967295 $int = $int > 4294967295 ? 4294967295 : $int; $dec = dechex($int); //講十進位轉為十六進位 //十六進位預設會忽略最左邊的0,畢竟是0了,怎麼算都是0,留著也沒用 //但中間的0會保留,而IP的十六進位最大為FFFFFF(大F團) //所有為防止7位IP的出現,我們只能手動補0,才能成雙成對(2個一對) if(strlen($dec) < 8) { $dec = '0'.$dec; //如果長度小於8,最自動補0 } for($i = 0; $i < 8; $i += 2){ $hex = substr($dec, $i, 2); $ippart = substr($hex, 0, 1);//截取十六進位的第一位 if($ippart === '0') { $hex = substr($hex, 1, 1);//如果第一位為0,說明原始數值只有1位,還是要拆散 } $aIp[] = hexdec($hex); //將每段十六進位數轉換我為十進位,即每個ip段的值 } return implode('.',$aIp); }以下為測試:
4.1、ip2long
判斷一個 ip4 地址是不是合法的 ip,符合則返回一個長整型,不符合返回 false
詳情參考:http://php.net/manual/en/function.ip2long.php
4.2、dechex
十進位轉化為十六進位(不用自己寫方法,爽)
詳情參考:http://www.php.net/manual/zh/function.dechex.php
4.3、hexdec
十六進位轉十進位
詳情參考:http://php.net/manual/zh/function.hexdec.php
4.4、long2ip
將長整型轉化為 ip4 格式的字元串,用於判斷一個ip是否合法
詳情參考:http://php.net/manual/en/function.long2ip.php