小編給大家分享一下PHP判斷某個IP4是否屬于某一個IP段的方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
為于洪等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及于洪網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為網(wǎng)站設計制作、做網(wǎng)站、于洪網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
很多時候,我們需要做 IP 黑名單或者 IP 白名單,來對訪客進行限制,很常見的一種就是對同一 IP 段內(nèi)的所有 IP 進行允許或限制,那么就我們就需要知道訪客 IP 是否屬于該 IP 段范圍內(nèi)。本文僅記錄一下方法。
其實本文還有一個應用場景,就是通常存儲在數(shù)據(jù)庫中的 IP 地址都是 varchar 類型的,而如果采用 INT 類型來保存 IP ,則可以對數(shù)據(jù)庫起到優(yōu)化的作用,當然這里只是針對 IP4 進行講解。
判斷一個 IP 是否屬于某一個 IP 段,思路就是將 IP 轉(zhuǎn)換成 int 類型的數(shù)值,然后進行比較。而在 PHP 中內(nèi)置了 ip 和數(shù)值的互換的函數(shù):ip2long($ip_addr) 和 long2ip($long)。
ip2long($ip_addr)中若 $ip_addr 不是有效的 IP 地址,則會返回 false,若是有效的 IP 地址,則會將其轉(zhuǎn)換為有符號 long 類型,而有些時候 IP 地址轉(zhuǎn)換后可能會超出有符號的 long 長度,這樣會導致出現(xiàn)負數(shù)。
long 類型是 4 個字節(jié)的,其有符號范圍是:2147483647 ~ -2147483648,無符號的范圍是:4294967295 ~ 0
而最大的 IP4 地址是:255.255.255.255,對應的數(shù)值是:4294967295,所以可以將其轉(zhuǎn)成無符號的數(shù)值。2147483647 數(shù)值對應的 IP 為:127.255.255.255,
long2ip(2147483647)所以 IP 地址在 0.0.0.0 至 127.255.255.255 范圍內(nèi)的不會出現(xiàn)負數(shù),而在 128.0.0.0 至 255.255.255.255 范圍內(nèi)的會出現(xiàn)負數(shù)情況。
以下代碼給出了一個完整、正確的判斷指定 IP 是否屬于某 IP 段內(nèi)的小例子。
$start_ip = "42.236.184.1"; $end_ip = "42.236.184.255"; $ip = "42.236.184.128"; check_ip($ip,$start_ip,$end_ip); function check_ip($ip,$start_ip,$end_ip) { $ip = get_ip2long($ip); $start_ip = get_ip2long($start_ip); $end_ip = get_ip2long($end_ip); if($ip >= $start_ip && $ip <= $end_ip) { return true; } return false; } // decbin() 十進制轉(zhuǎn)二進制 // bindec() 二進制轉(zhuǎn)十進制。函數(shù)將一個二進制數(shù)轉(zhuǎn)換成 integer??赊D(zhuǎn)換的最大的數(shù)為 31 位 1 或者說十進制的 2147483647。PHP 4.1.0 開始,該函數(shù)可以處理大數(shù)值,這種情況下,它會返回 float 類型。 function get_ip2long($ip) { return bindec(decbin(ip2long($ip))); //方法二:return sprintf('%u',ip2long($ip)); //%u:不包含正負號的十進制數(shù) }
看完了這篇文章,相信你對PHP判斷某個IP4是否屬于某一個IP段的方法有了一定的了解,想了解更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!