那么PHP中的$variable
有多大?我试过测试这个,但我不确定我有足够的系统内存(~2gb)。我认为必须有某种限制。字符串变得太大会发生什么?它是连接的,还是PHP抛出异常?
答案 0 :(得分:96)
http://php.net/manual/en/language.types.string.php说:
注意:从PHP 7.0.0开始,对64位版本的字符串长度没有特别限制。在32位版本和早期版本中,字符串最大可达2GB(最大2147483647字节)
在PHP 5.x中,字符串限制为2 31 -1个字节,因为内部代码以带符号的32位整数记录长度。
您可以使用file_get_contents()
但是,PHP脚本对给定脚本执行中的所有变量可分配的总内存有限制,因此这有效地限制了单个字符串变量的长度。
此限制是php.ini配置文件中的memory_limit
指令。 PHP 5.2中的内存限制默认为128MB,早期版本中的内存限制默认为8MB。
如果未在php.ini文件中指定内存限制,则使用默认值,该默认值将编译为PHP二进制文件。理论上,您可以修改源并重建PHP以更改此默认值。
如果在php.ini文件中指定-1
作为内存限制,它将停止检查并允许脚本使用与操作系统分配的内存一样多的内存。这仍然是一个实际限制,但取决于系统资源和架构。
来自@ c2的评论:
这是一个测试:
<?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));
答案 1 :(得分:16)
字符串可以与 2GB。一样大
Source
答案 2 :(得分:4)
PHP的字符串长度受PHP中字符串表示方式的限制;记忆与它没有任何关系。
根据phpinternalsbook.com,字符串存储在struct {char * val; int len;并且由于C中int的最大大小为4个字节,因此有效地将最大字符串大小限制为2GB。
答案 3 :(得分:2)
字符串变量的最大长度仅为2GiB - (2 ^(32-1)位)。变量可以在字符(8位/ 1字节)的基础上寻址,并且寻址由有符号整数完成,这就是为什么限制就是它的原因。数组可以包含多个变量,每个变量都遵循先前的限制,但可以具有最大为memory_limit的总累积大小,其中字符串变量也受其影响。
答案 4 :(得分:2)
在即将推出的新功能中,许多其他功能中,他们添加了对strings bigger than 2^31 bytes的支持:
支持64位版本中长度> = 2 ^ 31字节的字符串。
可悲的是,他们没有说明它能有多大。
答案 5 :(得分:0)
要正确回答此问题,您需要考虑PHP内部或PHP的目标。
要从x86的典型Linux角度回答这个问题......
C中的类型大小: https://usrmisc.wordpress.com/2012/12/27/integer-sizes-in-c-on-32-bit-and-64-bit-linux/
PHP中用于变量的类型: http://php.net/manual/en/internals2.variables.intro.php
字符串总是2GB,因为长度总是32位,因为它使用int而不是uint而浪费了一点。对于超过2GB的长度,int是不切实际的,因为它需要强制转换以避免破坏算术或者#34;而不是&#34;比较。额外的位可能用于溢出检查。
奇怪的是,当使用uint时,哈希键可能在内部支持4GB,尽管我从未将其用于测试。对于尾随的空字节,PHP散列键的长度为+1,据我所知,它被忽略,因此可能需要对该边缘情况进行无符号处理,而不是允许更长的密钥。
32位系统可能会施加更多外部限制。