Maison > Article > développement back-end > ip2long-long2ip
一,需求原因
Ip地址转换成整形存储,对于数据库优化来说是非常重要的。很多人把ip地址当做字符串类型来存储,当数据量庞大的时候,会很严重的消耗资源。而且,整形的索引速度要远远大于字符串的索引,所以就要用到ip转整形存储,使用时再将整形转回ip。php的ip转换,此文章讲解为ipv4,ipv6不做讲解。
二,系统内置函数Ip转换整形用到的函数是:ip2long
例:
$ip=” 60.6.205.138”; echo ip2long($ip);
整形转换ip用到的函数是:long2ip
例:
$ip=”60.6.205.138”; $ipInt=ip2long($ip); echo long2ip($ipInt);
三,常见的问题
1. 当ip地址比较大时,转换后的整数会有超过最大整形范围的情况。有符号整型最大值2147483647,当超过这个值就会变为负数。
解决办法:写成$ip = bindec(decbin(ip2long($ip)));
例:$ip = "192.168.10.1": $ip= bindec(decbin(ip2long($ip))); echo $ip;
说明:decbin函数将十进制转换为二进制,bindec函数将二进制转换为整形。
2. 当一些ip地址有前缀0时,转换就会出错。
例:$ip = '021.110.11.49'; $ip_int = ip2long($ip); echo $ip."<br>"; echo $ip_int."<br>"; echo long2ip($ip_int);
当ip转换为整形后,再转回ip时就会出错,ip地址与原来不符。原因为有前导0.
解决办法:
第一,因为ip转换整形是是以:第一段乘以256的三次方,第二段乘以256的平方,第三段乘以256、最后总和得出的结果。$ip = '060.06.205.138'; function ipToInt($ip){ $iparr = explode('.',$ip); $num = 0; for($i=0;$i<count intval return echo></count>';
说明:
intval把变量转换为整数类型
pow(4,2)返回16,返回x的y次方
第二,通过位运算符解决。
$ip = '060.06.205.138'; function ipToInt($ip){ $iparr = explode('.',$ip); return (intval($iparr[0]'; $ipInt = ipToInt($ip); echo $ipInt.'<br>'; echo long2ip($ipInt);
位运算符算法简单说就是,左移三位把当前数乘以2的三次方,左移两位乘以2的平方。右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位或者一律补0,或者补符号位,这由不同的机器而定。
如果大家不理解,就按第一种方法来。
文章到此就结束了,如果大家有什么问题可以留言我们一起讨论。希望大家多动手练练,好加深印象,我们一起加油!
以上就介绍了ip2long-long2ip,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。