什么是在PHP中的string的最大长度?

那么PHP中的$variable多大? 我试图testing这个,但我不确定我有足够的系统内存(〜2GB)。 我觉得那里肯定有某种限制。 当一个string变得太大时会发生什么? 它是连接的,还是PHP抛出exception?

单个stringvariables本身没有架构限制。
编辑:作为用户@Pacerier下面的评论,PHP手册现在指出:

注意: string可以大到2GB。

(2010年我第一次回答这个问题时,这个说明并没有在手册中)

您可以在整个文件的内容中徘徊,例如使用file_get_contents()

但是,PHP脚本在给定的脚本执行中可以为所有variables分配的内存总量有限制,所以这也有效地限制了单个stringvariables的长度。

此限制是php.iniconfiguration文件中的memory_limit指令。 内存限制在PHP 5.2中默认为128MB,在早期版本中默认为8MB。

如果你没有在你的php.ini文件中指定一个内存限制,它将使用编译到PHP二进制文件中的默认值。 从理论上讲,你可以修改源代码并重buildPHP来改变这个默认值。

如果在php.ini文件中指定-1作为内存限制,它将停止检查并允许您的脚本使用尽可能多的内存作为操作系统将分配。 这仍然是一个实际的限制,但取决于系统资源和架构。


来自@ c2的评论:

这是一个testing:

 <?php -- limit memory usage to 1MB ini_set('memory_limit', 1024*1024); -- initially, PHP seems to allocate 768KB for basic operation printf("memory: %d\n", memory_get_usage(true)); $str = str_repeat('a', 255*1024); echo "Allocated string of 255KB\n"; -- now we have allocated all of the 1MB of memory allowed printf("memory: %d\n", memory_get_usage(true)); -- going over the limit causes a fatal error, so no output follows $str = str_repeat('a', 256*1024); echo "Allocated string of 256KB\n"; printf("memory: %d\n", memory_get_usage(true)); 

string可以大到2GB。
资源

PHP的string长度受string以PHP表示的方式的限制; 记忆与它没有任何关系。

根据phpinternalsbook.com ,string存储在struct {char * val; int len; }并且由于C中int的最大大小是4字节,所以这有效地将最大string大小限制为2GB。

在一个新的即将到来的php7和其他许多function中,他们增加了对大于2 ^ 31个字节的string的支持:

支持长度大于等于2 ^ 31个字节的64位string。

可悲的是,他们没有具体说明可以做多大。

stringvariables的最大长度只有2GiB – (2 ^(32-1)位)。 variables可以在一个字符(8位/ 1字节)的基础上寻址,寻址是由有符号整数完成的,这就是为什么它的限制。 数组可以包含多个variables,每个variables都遵循前面的限制,但可以有一个总的累计大小,直到memory_limitstringvariables也受其影响。

为了正确回答这个问题,你需要考虑PHP内部或者PHP的目标。

从x86上典型的Linuxangular度来回答这个问题。

C中的types大小: https : //usrmisc.wordpress.com/2012/12/27/integer-sizes-in-c-on-32-bit-and-64-bit-linux/

PHP中用于variables的types: http : //php.net/manual/en/internals2.variables.intro.php

string总是2GB,因为长度总是32位,因为它使用int而不是uint,所以浪费了一点。 对于超过2GB的长度,int是不切实际的,因为它需要强制转换来避免算术或“比”的比较。 额外的位可能被用于溢出检查。

奇怪的是,哈希键可能内部支持4GB,因为使用uint,虽然我从来没有把这个testing。 PHP哈希键的长度为空字符的+1,据我所知,它被忽略了,所以可能需要对该边缘情况进行无符号的匹配,而不是允许更长的键。

一个32位系统可能会施加更多的外部限制。

没有限制。