为什么PHP strlen()返回负长度?
正在为使用以下方法创建的“大字符串”返回负值:为什么PHP strlen()返回负长度?,php,string,debugging,Php,String,Debugging,正在为使用以下方法创建的“大字符串”返回负值: 是否定义了此行为 或者这是一个PHP错误?我想您只是用大字符串溢出了一个int。从手册中: 整数的大小取决于平台,尽管通常的最大值约为20亿(即32位有符号)。PHP不支持无符号整数。整数大小可以使用常量PHP_INT_size确定,最大值可以使用自PHP 4.4.0和PHP 5.0.5以来的常量PHP_INT_MAX确定 所以,如果字符串大小可以适合int,那么就可以了 看起来它实际上是(2GB-1)。这在我的x64机箱上运行良好: $st
是否定义了此行为
或者这是一个PHP错误?我想您只是用大字符串溢出了一个int。从手册中: 整数的大小取决于平台,尽管通常的最大值约为20亿(即32位有符号)。PHP不支持无符号整数。整数大小可以使用常量PHP_INT_size确定,最大值可以使用自PHP 4.4.0和PHP 5.0.5以来的常量PHP_INT_MAX确定 所以,如果字符串大小可以适合int,那么就可以了 看起来它实际上是(2GB-1)。这在我的x64机箱上运行良好:
$str = str_repeat('a', 2 * 1024 * 1024 * 1024 -1);
echo $str[0];
。。。在这种情况下:
$str = str_repeat('a', 2 * 1024 * 1024 * 1024);
echo $str[0];
您所做的只是没有定义,手册应该更正。我也希望得到警告
有趣的是,这引发了一个致命错误:
$str = str_repeat('a', 2 * 1024 * 1024 * 1024 -2); // 2GB - 2 bytes
$str .= 'b'; // ok
$str .= 'c'; // PHP Fatal error: String size overflow
更新:
这个问题已得到解决。php.net上的文档已经修复,现在写入“2147483647字节最大值”。看起来您在32位php上遇到了最大整数值。64位服务器将报告准确的长度。由于strlen返回一个整数值,PHP中的所有整数都是有符号整数,而32位PHP使用32位有符号整数,因此它是隐式定义的。常量PHP_INT_MAX为您提供了上限,因此值“wrapps”并变为负值。请看这里(注意:
当PHP.net声明“note string可以大到2GB”时)php.net/manual/en/language.types.string.php他们的意思是它可以超过2GB吗?–Pacier Jun 6在14:49时
我在64位php上得到了与OP相同的输出。php_INT_SIZE
==8。@jcsanyi做echo strlen($str)
将报告与var_dump()相同的负值这里…没有整数溢出,我的PHP_INT_MAX报告9223372036854775807读取。如果字符串有不同的限制,最大整数值是多少并不重要。@Gumbo,strlen()返回一个int。因此您可以从strlen返回int limit。不管字符串有什么限制。@Jk1只能表示最多2^31-1的值。@Gumbo,这是zend server的实现,但并不意味着所有PHP实现都需要遵循这个限制,对吗?我按照您的建议提交了错误报告t:是的,由于某种原因,即使echo$str[0];
不起作用,字符串仍然占用内存,我们可以对其进行操作(使用trim等)@Pacerier您可能希望将带有字符串连接的测试用例添加到错误报告中,这似乎支持这是一个文档错误的想法。此外,str\u repeat
可能会抛出与连接时相同的致命错误。至少str\u pad
确实存在错误。我认为这不仅仅是一个文档错误,它本质上是一个stru repeat
bug。我认为没有其他函数允许我们创建长度大于2147483647的字符串,是吗?
$str = str_repeat('a', 2 * 1024 * 1024 * 1024 -2); // 2GB - 2 bytes
$str .= 'b'; // ok
$str .= 'c'; // PHP Fatal error: String size overflow