
许多时刻,我们需要做 IP 黑名单或许 IP 白名单,来对访客举行限定,很罕见的一种就是对统一 IP 段内的一切 IP 举行许可或限定,那末就我们就需要晓得访客 IP 是不是属于该 IP 段局限内。本文仅纪录一下要领。
实在本文另有一个运用场景,就是一般存储在数据库中的 IP 地点都是 varchar 范例的,而假如采纳 INT 范例来保留 IP ,则能够对数据库起到优化的作用,固然这里只是针对 IP4 举行解说。
推断一个 IP 是不是属于某一个 IP 段,思绪就是将 IP 转换成 int 范例的数值,然后举行比较。而在 PHP 中内置了 ip 和数值的交换的函数:ip2long($ip_addr) 和 long2ip($long)。
ip2long($ip_addr)中若 $ip_addr 不是有用的 IP 地点,则会返回 false,如果有用的 IP 地点,则会将其转换为有标记 long 范例,而有些时刻 IP 地点转换后可能会超越有标记的 long 长度,如许会致使涌现负数。
long 范例是 4 个字节的,其有标记局限是:2147483647 ~ -2147483648,无标记的局限是:4294967295 ~ 0
而最大的 IP4 地点是:255.255.255.255,对应的数值是:4294967295,所以能够将其转成无标记的数值。2147483647 数值对应的 IP 为:127.255.255.255,
long2ip(2147483647)所以 IP 地点在 0.0.0.0 至 127.255.255.255 局限内的不会涌现负数,而在 128.0.0.0 至 255.255.255.255 局限内的会涌现负数状况。
以下代码给出了一个完全、准确的推断指定 IP 是不是属于某 IP 段内的小例子。
$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() 十进制转二进制 // bindec() 二进制转十进制。函数将一个二进制数转换成 integer。可转换的最大的数为 31 位 1 或许说十进制的 2147483647。PHP 4.1.0 最先,该函数能够处置惩罚大数值,这类状况下,它会返回 float 范例。 function get_ip2long($ip) { return bindec(decbin(ip2long($ip))); //要领二:return sprintf('%u',ip2long($ip)); //%u:不包括正负号的十进制数 }
更多PHP相干学问,请接见ki4网!
以上就是PHP推断某个IP4是不是属于某一个IP段的细致内容,更多请关注ki4网别的相干文章!