不少时分,咱们需求做 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相干常识,请拜访PHP中文网!
以上就是PHP判别某个IP4能否属于某一个IP段的具体内容,更多请存眷资源魔其它相干文章!
标签: php开发教程 php开发资料 php开发自学 ip
抱歉,评论功能暂时关闭!