那么$variablePHP中的大小可以达到多少呢?我已经尝试过测试,但是我不确定我是否有足够的系统内存(〜2gb)。我认为必须有某种限制。字符串太大时会发生什么?它是串联的,还是PHP抛出异常?
那么$variablePHP中的大小可以达到多少呢?我已经尝试过测试,但是我不确定我是否有足够的系统内存(〜2gb)。我认为必须有某种限制。字符串太大时会发生什么?它是串联的,还是PHP抛出异常?
Answers:
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脚本在给定脚本执行中可以为所有变量分配的总内存中有限制,因此,这实际上也限制了单个字符串变量的长度。
此限制是memory_limitphp.ini配置文件中的指令。内存限制在PHP 5.2中默认为128MB,在早期版本中为8MB。
如果您未在php.ini文件中指定内存限制,它将使用默认值,该默认值将编译到PHP二进制文件中。从理论上讲,您可以修改源代码并重建PHP以更改此默认值。
如果您-1在php.ini文件中指定作为内存限制,它将停止检查并允许脚本使用操作系统分配的内存。这仍然是实际的限制,但是取决于系统资源和体系结构。
来自@ 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));
PHP的字符串长度受PHP中字符串表示方式的限制。内存与它无关。
根据phpinternalsbook.com,字符串存储在struct {char * val;中。英伦 由于C中int的最大大小为4个字节,因此有效地将最大字符串大小限制为2GB。
为了正确回答这个问题,您需要考虑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/zh/internals2.variables.intro.php
字符串始终为2GB,长度始终为32位,并且由于使用int而不是uint而浪费了一点时间。int对于超过2GB的长度是不切实际的,因为它需要强制转换以避免破坏算术或“ than”比较。多余的位可能用于溢出检查。
奇怪的是,使用uint时,哈希键可能在内部支持4GB,尽管我从未进行过测试。PHP哈希键的长度为+1,而尾随的空字节被忽略,据我所知,因此在这种情况下可能需要将其取消签名,而不是允许使用更长的键。
32位系统可能会施加更多的外部限制。