在网站的优化中如果将IP地址转成整形来存储的话,可以大大的降低数据库的索引时间,而且还节省了很多的服务器资源。在php中,可以借助内置的预设函数 ip2long() 和 long2ip() 来实现IP地地数据类型的转换,但需要要注意的是 ip2long() 和 long2ip() 只能实现IPV4地址的处理!
php ip2long() 函数详解
ip2long:将 IPV4 地址转换成长整型数字!
语法:ip2long($ip_address)
参数:$ip_address 为 IPV4 地址
示例:<?php
$ip = '127.168.0.125';
//echo ip2long($ip);
// 2141716605
$ip2 = '192.0.34.166';
echo ip2long($ip2);
//3221234342 (64位系统下输出)
//-1073732954 (32位系统下会输出负数)
?>
php long2ip() 函数详解
long2ip:将长整型数字转化为标准的IPV4地址!
语法:long2ip($proper_address)
参数:$proper_address 要转换的长整型数字
示例:<?php
$ip = '127.168.0.125';
$ipstr = ip2long($ip);
echo long2ip($ipstr);
// 127.168.0.125
$ip2 = '192.0.34.166';
$ipstr2 = ip2long($ip2);
echo long2ip($ipstr2);
// 192.0.34.166
?>
ip2long() 转换后的负数问题
当ip地址比较大时,转换后的整数会有超过最大整形范围(也就是溢出)的情况。而超过的部份就会成为负数,为避免此情况的出现我们需要对 ip2long(0 的结果进行处理一下!
处理方法1:
示例代码:<?php
$ip = "192.0.34.166";
$strip = bindec(decbin(ip2long($ip))); //这里通过二进制进行处理一下
echo $strip;
// 将整数类型转成IPV4
echo long2ip($strip);
?>
注:decbin函数将十进制转换为二进制,bindec函数将二进制转换为整形。
处理方法2:
使用类C的sprintf方法来避免 ip2long 出现负数的问题
示例代码:<?php
echo sprintf("%u\n", ip2long("157.23.56.90"));
// 2635544666
?>