在网站的优化中如果将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
?>