最近在做网站访问统计,结果发现数据库中存储的IP字段有一些是0,排查发现是因为IPv6在使用IPv4的方法转换的时候导致的,接下来吾爱编程为大家介绍一下关于PHP中将ip转为数字(ipv4/ipv6)的方法,有需要的小伙可以参考一下:
1、项目需求:
统计用户访问量,每篇文章相同IP只记录一次,为了方便需要将IP转换为数字存储
2、转换程序代码:
(1)、方法一**
* Description: 此函数用来将Ip转换为数字,便于存储
* ip:IPv6、Ipv6
* PS:需开启php_gmp扩展
*/
function ip2long_int($ip){
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
return sprintf('%u',ip2long($ip));
} else if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
$ip_n = inet_pton($ip);
$bits = 15; // 16 x 8 bit = 128bit
$ipv6long = '';
while ($bits >= 0) {
$bin = sprintf("%08b", (ord($ip_n[$bits])));
$ipv6long = $bin . $ipv6long;
$bits--;
}
return gmp_strval(gmp_init($ipv6long, 2), 10);
}
}
(2)、方法二:/**
* description: 此函数用来将Ip转换为数字,便于存储
* ip:IPv4、IPv6
*/
function ip2long_int($ip){
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
return sprintf('%u',ip2long($ip));
} else if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
$ip_n = inet_pton($ip);
$bin = '';
for ($bit = strlen($ip_n) - 1; $bit >= 0; $bit--) {
$bin = sprintf('%08b', ord($ip_n[$bit])) . $bin;
}
if (function_exists('gmp_init')) {
return gmp_strval(gmp_init($bin, 2), 10);
} elseif (function_exists('bcadd')) {
$dec = '0';
for ($i = 0; $i
$dec = bcmul($dec, '2', 0);
$dec = bcadd($dec, $bin[$i], 0);
}
return $dec;
} else {
trigger_error('GMP or BCMATH extension not installed!', E_USER_ERROR);
}
}
}
PS:由于IPv6转换后的字符串长度是38位的数字,需要将数据库中的字段类型转为char或varchar类型。
以上就是吾爱编程为大家介绍的关于PHP中将ip转为数字(ipv4/ipv6)的方法,了解更多相关文章请关注吾爱编程网!