IPv6地址转为ip2long

stackoverflow上有一个很好用的方法,点击查看。可能需要翻墙,如果打不开,可以参考下面的例子:

function ip2long_v6($ip) {
    $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 < strlen($bin); $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);
    }
}

$ip = 'fe80:0:0:0:202:b3ff:fe1e:8329';
$res = ip2long_v6($ip);
var_dump($res);

这里要讨论的是如果运行这个方法提示”GMP or BCMATH extension not installed”的情况。
根据提示很明显是没有安装gmp、bcmath两个扩展,两个扩展的功能可以参考手册bcmath, gmp

由于在本地MAC两个PHP版本(php5.6.30与php7.0.22)下测试方法都正常,在测试机上提示了缺少扩展gmp、bcmath。
在本地查看扩展, 两个版本都有bcmath,都没有gmp。php5版本是自带的,php7是自己编译安装的。测试机上两个模块都没有。由此可见,只需要安装bcmath即可。

// 检查本地php是否存在模块gmp 或 bcmath
php -m | grep -E 'bcmath|gmp'
php7 -m | grep -E 'bcmath|gmp'
bcmath

资料显示php5和php7的源码包中都有bcmath扩展(编译扩展安装参考),测试机上由于历史久远使用的是php5.4.41并且找不到源码包,通过yum安装即可

yum install php-bcmath

yum安装果然很神秘, 安装后查看bcmath发现, 不同版本的php下都有bcmath.so扩展文件了。

find / -name bcmath.so

/usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/bcmath.so
/usr/local/php7/lib/php/extensions/no-debug-non-zts-20100525/bcmath.so
/usr/lib64/php/modules/bcmath.so

在php.ini文件中引入bcmath.so
echo ‘extension=”bcmath.so”‘ >> /usr/local/php/lib/php.ini

重启php-fpm

参考:
https://stackoverflow.com/questions/3400362/how-to-install-bcmath-module

发表评论

电子邮件地址不会被公开。 必填项已用*标注