Итак, насколько большой может $variable
в PHP? Я попытался проверить это, но я не уверен, что у меня достаточно системной памяти (~ 2gb). Я полагаю, что должен быть какой-то предел. Что происходит, когда строка становится слишком большой? Является ли он конкатенированным, или PHP генерирует исключение?
Какова максимальная длина строки в 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));
Ответ 2
Строка может быть как 2 ГБ.
Источник
Ответ 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
Нет ограничений.