Какова максимальная длина строки в PHP?

Итак, насколько большой может $variable в PHP? Я попытался проверить это, но я не уверен, что у меня достаточно системной памяти (~ 2gb). Я полагаю, что должен быть какой-то предел. Что происходит, когда строка становится слишком большой? Является ли он конкатенированным, или PHP генерирует исключение?

Ответ 1

http://php.net/manual/en/language.types.string.php говорит:

Примечание. С PHP 7.0.0 особых ограничений относительно длины строки в 64-битных сборках нет. В 32-битных сборках и в более ранних версиях строка может достигать 2 ГБ (максимум 2147483647 байт)

В PHP 5.x строки были ограничены 2 31 -1 байтами, потому что внутренний код записывал длину в 32-битовое целое число.


Вы можете разгладить содержимое всего файла, например, используя file_get_contents()

Однако PHP script имеет ограничение на общую память, которую он может выделить для всех переменных в данном выполнении script, поэтому это также ограничивает длину одной строковой переменной.

Этот предел является директивой memory_limit в файле конфигурации php.ini. Предел памяти по умолчанию равен 128 МБ в PHP 5.2 и 8 МБ в более ранних версиях.

Если вы не указали ограничение памяти в файле php.ini, оно использует значение по умолчанию, которое скомпилировано в двоичный файл PHP. В теории вы можете изменить источник и перестроить PHP, чтобы изменить это значение по умолчанию.

Если вы укажете -1 как ограничение памяти в файле php.ini, прекратите проверку и разрешите script использовать столько же памяти, сколько будет выделена операционная система. Это по-прежнему практический предел, но зависит от системных ресурсов и архитектуры.


Re comment from @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));

Ответ 3

Длина строки PHP ограничена тем, как строки представлены в PHP; память не имеет к этому никакого отношения.

Согласно phpinternalsbook.com, строки хранятся в struct {char * val; int len; }, и поскольку максимальный размер int в C равен 4 байтам, это фактически ограничивает максимальный размер строки до 2 ГБ.

Ответ 4

Максимальная длина строковой переменной равна только 2GiB - (2 ^ (32-1) бит). Переменные могут быть адресованы на основе символа (8 бит /1 байт), а адресация выполняется целыми знаками, поэтому предел - это то, что есть. Массивы могут содержать несколько переменных, каждая из которых соответствует предыдущему ограничению, но может иметь общий кумулятивный размер до memory_limit, для которого также подчиняется строковая переменная.

Ответ 5

В новом предстоящем php7 среди многих других функций они добавили поддержку строк больше 2 ^ 31 байт:

Поддержка строк с длиной >= 2 ^ 31 байта в 64-битных сборках.

К сожалению, они не указали, насколько это может быть больше.

Ответ 6

Чтобы правильно ответить на этот вопрос, вам нужно рассмотреть внутренности PHP или цель, для которой построен PHP.

Чтобы ответить на это с типичной точки зрения Linux на x86...

Размеры типов в 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

Строки всегда равны 2 ГБ, так как длина всегда 32 бит, а бит - впустую, потому что он использует int, а не uint. int нецелесообразно для длин более 2 ГБ, поскольку для этого требуется бросок, чтобы избежать арифметических или "сравнительных" сравнений. Дополнительный бит, вероятно, используется для проверки переполнения.

Странно, хеш-ключи могут внутренне поддерживать 4 ГБ, поскольку используется uint, хотя я никогда не применял это к тесту. Ключи хэша PHP имеют +1 к длине для конечного нулевого байта, который, насколько мне известно, игнорируется, поэтому для этого случая с корнем может потребоваться без знака, а не для предоставления более длинных ключей.

32-битная система может налагать больше внешних ограничений.

Ответ 7

Нет ограничений.