How to handle IPv6 Addresses in PHP?(如何在PHP中处理IPv6地址?)
本文介绍了如何在PHP中处理IPv6地址?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
仔细搜索之后,我注意到PHP中稍微缺少处理IPv6的函数。为了个人满意,我创建了几个函数来帮助过渡。
IPv6ToLong()
函数是这里提出的解决方案的临时解决方案:How to store IPv6-compatible address in a relational database。它会将IP拆分为两个整数,并以数组形式返回它们。
/**
* Convert an IPv4 address to IPv6
*
* @param string IP Address in dot notation (192.168.1.100)
* @return string IPv6 formatted address or false if invalid input
*/
function IPv4To6($Ip) {
static $Mask = '::ffff:'; // This tells IPv6 it has an IPv4 address
$IPv6 = (strpos($Ip, '::') === 0);
$IPv4 = (strpos($Ip, '.') > 0);
if (!$IPv4 && !$IPv6) return false;
if ($IPv6 && $IPv4) $Ip = substr($Ip, strrpos($Ip, ':')+1); // Strip IPv4 Compatibility notation
elseif (!$IPv4) return $Ip; // Seems to be IPv6 already?
$Ip = array_pad(explode('.', $Ip), 4, 0);
if (count($Ip) > 4) return false;
for ($i = 0; $i < 4; $i++) if ($Ip[$i] > 255) return false;
$Part7 = base_convert(($Ip[0] * 256) + $Ip[1], 10, 16);
$Part8 = base_convert(($Ip[2] * 256) + $Ip[3], 10, 16);
return $Mask.$Part7.':'.$Part8;
}
/**
* Replace '::' with appropriate number of ':0'
*/
function ExpandIPv6Notation($Ip) {
if (strpos($Ip, '::') !== false)
$Ip = str_replace('::', str_repeat(':0', 8 - substr_count($Ip, ':')).':', $Ip);
if (strpos($Ip, ':') === 0) $Ip = '0'.$Ip;
return $Ip;
}
/**
* Convert IPv6 address to an integer
*
* Optionally split in to two parts.
*
* @see https://stackoverflow.com/questions/420680/
*/
function IPv6ToLong($Ip, $DatabaseParts= 2) {
$Ip = ExpandIPv6Notation($Ip);
$Parts = explode(':', $Ip);
$Ip = array('', '');
for ($i = 0; $i < 4; $i++) $Ip[0] .= str_pad(base_convert($Parts[$i], 16, 2), 16, 0, STR_PAD_LEFT);
for ($i = 4; $i < 8; $i++) $Ip[1] .= str_pad(base_convert($Parts[$i], 16, 2), 16, 0, STR_PAD_LEFT);
if ($DatabaseParts == 2)
return array(base_convert($Ip[0], 2, 10), base_convert($Ip[1], 2, 10));
else return base_convert($Ip[0], 2, 10) + base_convert($Ip[1], 2, 10);
}
对于这些函数,我通常首先调用此函数来实现它们:
/**
* Attempt to find the client's IP Address
*
* @param bool Should the IP be converted using ip2long?
* @return string|long The IP Address
*/
function GetRealRemoteIp($ForDatabase= false, $DatabaseParts= 2) {
$Ip = '0.0.0.0';
// [snip: deleted some dangerous code not relevant to question. @webb]
if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] != '')
$Ip = $_SERVER['REMOTE_ADDR'];
if (($CommaPos = strpos($Ip, ',')) > 0)
$Ip = substr($Ip, 0, ($CommaPos - 1));
$Ip = IPv4To6($Ip);
return ($ForDatabase ? IPv6ToLong($Ip, $DatabaseParts) : $Ip);
}
请谁告诉我是我在这里重新发明轮子,还是我做错了什么。
此实现将IPv4转换为IPv6。它未触及的任何IPv6地址。
推荐答案
inet_ntop()
怎么样?然后,您只需使用varbinary(16)
来存储它,而不是将其切成整数。
这篇关于如何在PHP中处理IPv6地址?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:如何在PHP中处理IPv6地址?


猜你喜欢
- 如何从数据库中获取数据以在 laravel 中查看页面? 2022-01-01
- 使用 GD 和 libjpeg 支持编译 PHP 2022-01-01
- Oracle 即时客户端 DYLD_LIBRARY_PATH 错误 2022-01-01
- Laravel 5:Model.php 中的 MassAssignmentException 2021-01-01
- openssl_digest vs hash vs hash_hmac?盐与盐的区别HMAC? 2022-01-01
- 如何在 Symfony2 中正确使用 webSockets 2021-01-01
- 覆盖 Magento 社区模块控制器的问题 2022-01-01
- PHP foreach() 与数组中的数组? 2022-01-01
- PHP - if 语句中的倒序 2021-01-01
- 如何使用 Google API 在团队云端硬盘中创建文件夹? 2022-01-01