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

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

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-скрипт имеет ограничение на общую память, которую он может выделить для всех переменных при выполнении данного сценария, поэтому это также ограничивает длину одной строковой переменной.

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

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

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


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)); 

Строка может достигать 2 ГБ.
Источник

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

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

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

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

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

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

Чтобы правильно ответить на этот вопрос, вам нужно рассмотреть внутренности 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-битная система может налагать больше внешних ограничений.

Нет предела.