在 PHP 中一个字符串的最大长度是多少?

那么一个 $variable在 PHP 中能有多大呢?我尝试过测试这个,但是我不确定我是否有足够的系统内存(~ 2gb)。我觉得肯定有某种限制。当一个字符串变得太大时会发生什么?它是连接的,还是 PHP 抛出异常?

134437 次浏览

Http://php.net/manual/en/language.types.string.php 说:

注意: 从 PHP7.0.0开始,对于64位构建中的字符串长度没有特别的限制。在32位版本和早期版本中,字符串最大可达2GB (最大2147483647字节)

在 PHP 5.x 中,字符串被限制为231-1字节,因为内部代码记录的长度是一个有符号的32位整数。


您可以吸收整个文件的内容,例如使用 file_get_contents()

但是,PHP 脚本对于在给定的脚本执行中分配给所有变量的总内存有限制,因此这实际上也限制了单个字符串变量的长度。

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

如果没有在 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));

字符串可以大到 < strong > 2 GB。
来源

PHP 的字符串长度受到 PHP 中字符串表示方式的限制; 内存与此无关。

根据 Phpinternalsbook.com,字符串存储在 struct { char * val; int len; }中,由于 C 中 int 的最大大小为4字节,因此有效地将最大字符串大小限制为2 GB。

字符串变量的最大长度只有2GiB-(2 ^ (32-1)位)。变量可以在一个字符(8位/1字节)的基础上寻址,并且寻址是由有符号整数完成的,这就是为什么限制是什么。数组可以包含多个变量,每个变量都遵循前面的限制,但是可以具有最大到 memory _ limit 的总累积大小,其中字符串变量也受到这个限制的约束。

在即将发布的 php7中,他们增加了对 大于2 ^ 31字节的字符串的支持:

在64位构建中支持长度 > = 2 ^ 31字节的字符串。

遗憾的是,他们没有具体说明它能大多少。

要正确回答这个问题,您需要考虑 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,一个位被浪费了。Int 对于超过2GB 的长度是不切实际的,因为它需要强制转换来避免破坏算术或“ than”比较。额外的位可能用于溢出检查。

奇怪的是,在使用 uint 时,散列键可能在内部支持4GB,尽管我从未对此进行过测试。PHP 散列键有一个 + 1的长度为一个尾随空字节,据我所知被忽略,所以它可能需要无符号的边缘情况下,而不是允许更长的键。

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