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



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

717   6  
PHP

6 ответов:

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

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

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


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

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

этот лимит -memory_limit директива в php.ini конфигурационный файл. Ограничение памяти по умолчанию составляет 128 МБ в PHP 5.2 и 8 МБ в предыдущие версии.

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

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


Re комментарий от @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 ГБ как длина всегда 32bits и бит тратится впустую, потому что он использует int, а не uint. int непрактичен для длин более 2 ГБ, поскольку он требует приведения, чтобы избежать нарушения арифметики или сравнения" чем". Дополнительный бит, вероятно, используется для проверки переполнения.

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

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

Comments

    Ничего не найдено.