Что ограничивает PHP память, когда memory_limit установлен в -1? - PullRequest
2 голосов
/ 25 октября 2019

Фон

Я понимаю, как настройка PHP memory_limit может использоваться для контроля того, сколько памяти доступно для использования PHP.

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

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

Иллюстрация

Мы можем продемонстрировать, что это действительно так, используя следующеескрипт:

<?php

    print(ini_get('memory_limit') . "\n");

    ini_set('memory_limit', -1);
    print(ini_get('memory_limit') . "\n");

    $x = "123456789ABCDEF";
    while (true)
        $x .= $x;

?>

При запуске из командной строки я получаю следующий вывод:

Оригинал: 128M, Новый: -1

PHP Fatalошибка: недостаточно памяти (выделено 503840768) (попытка выделить 1006632961 байт) в файле test.php в строке 14

Неустранимая ошибка: недостаточно памяти (выделено 503840768) (попытка выделить 1006632961 байт) в файле test.phpпо линии 14

зеnd_mm_heap поврежден

А из Интернета (через Apache) я получаю нечто подобное:

Оригинал: 128M, Новый: -1

Неустранимая ошибка:Недостаточно памяти (выделено 503840768) (попытался выделить 1006632961 байт) в файле test.php в строке 14

В моих примерах значения совпадают (~ 480 МБ), поэтому не похоже, чтовеб-сервер устанавливает ограничение. Кроме того, это далеко не столько объема ОЗУ, установленного в системе (даже без учета виртуальной памяти), так что это не является аппаратным ограничением.

Обратите внимание, что эти тесты выполнялись на PHP 5.6 на машине с Windows с 4 ГББАРАН. Однако вывод аналогичен в других версиях PHP .

Наконец, мы подходим к вопросу!

Учитывая вышеизложенное:

  1. Чтона самом деле диктует предел памяти, когда мы устанавливаем его -1?
  2. Есть ли способ узнать, что это за предел в PHP?
...