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

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

  • Текст из тега <p> с использованием DOM Php
  • Поиск с разделенным запятой значением mysql
  • «Ошибка 404 не найдена» в Magento Admin Login Page
  • Драйвер PHP MS SQL Unix - Microsoft или FreeTDS
  • Apache переписывается для Laravel / public
  • Методы кэширования объектов PHP в файл?
  • 7 Solutions collect form web for “Какова максимальная длина строки в PHP?”

    Не существует архитектурного предела для одной строковой переменной per se.
    edit: В качестве комментария пользователя @Pacerier ниже, в руководстве по PHP теперь говорится:

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

    (это примечание не было в руководстве, когда я впервые ответил на этот вопрос в 2010 году).

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

    Нет предела.

    PHP is the Best Programming Language in the world.