Php ip2long(“012.012.012.012”在Linux上返回false

Php ip2long(“012.012.012.012”在Linux上返回false,php,ip2long,Php,Ip2long,假设IPv4地址表示中有前导零,如012.012.012.012 为了抑制前导零,我只需编写以下代码,它在Mac上的工作方式与我预期的一样: % php -r 'var_dump(long2ip(ip2long("012.012.012.012")));' Command line code:1: string(11) "12.12.12.12" % php --version PHP 7.3.25 (cli) (built: Dec 25 2020 2

假设IPv4地址表示中有前导零,如
012.012.012.012

为了抑制前导零,我只需编写以下代码,它在Mac上的工作方式与我预期的一样:

% php -r 'var_dump(long2ip(ip2long("012.012.012.012")));'
Command line code:1:
string(11) "12.12.12.12"

% php --version
PHP 7.3.25 (cli) (built: Dec 25 2020 22:03:38) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.25, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.25, Copyright (c) 1999-2018, by Zend Technologies
    with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans
但这段简单的代码在CentOS 7上不起作用,它似乎
ip2long(“012.012.012.012”)
返回
false
值:

$ php -r 'var_dump(long2ip(ip2long("012.012.012.012")));'
string(7) "0.0.0.0"

$ php --version
PHP 7.3.25 (cli) (built: Nov 24 2020 11:10:55) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.25, Copyright (c) 1998-2018 Zend Technologies

$ cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
两个PHP版本都是相同的,我希望它们返回完全相同的值。我还阅读了,并试图找出是否有任何特殊的选项/配置,为这种行为,但没有运气

有人能把我引向正确的方向吗?
是什么让他们与众不同?我该怎么办?好的,我找到了罪犯。LLVM和GCC之间
inet\u pton(3)
的不同实现导致了这种行为,如下所示。六年前也有同样的问题。似乎PHPV5.2.10已经开始使用
inet\u pton
而不是
inet\u addr
,根据,这就是为什么将每个块视为八进制

测试c
#包括
#包括


到目前为止还没有问题。

4.3-5.2.9:
“10.10.10.10”
|5.2.10-8.0.1:
“0.0.0”
0:0。。。旧版本的PHP将每个数字视为八进制,因为前导为零,而新版本将其视为无效?我的Mac电脑不是他们两个……我不知道;)我的mac(7.4.9-10.15.7)显示
12.12.12.12
,而我的Debian9(7.2.24)显示
0.0.0
。ip地址无效时,ip2long返回false,在我可以访问的CentOS系统上,012.012.012.012返回false,而12.12.12返回202116108。我正在四处寻找更多的信息,但可能是Linux的东西看起来这种行为已经存在至少6年了。此处有一个条目警告此行为:。基于此,听起来您应该预处理IP地址以删除前导零。
% cc test.cc && ./a.out
Valid: 012.012.012.012
$ cc test.cc && ./a.out
Invalid: 012.012.012.012
>>> \IPLib\Address\IPv4::fromString("1.2.3.12")->toString(true);
=> "001.002.003.012"
>>> \IPLib\Address\IPv4::fromString("001.002.003.012")->toString();
=> "1.2.3.12"