PHP 8.5: Новая INI директива max_memory_limit задающая верхний предел memory_limit

В PHP 8.5 разработчики получили новый инструмент управления ограничениями памяти — INI-директива max_memory_limit. Она позволяет задать верхний предел, выше которого значение memory_limit задать невозможно. Это упрощает контроль ресурсов в продакшене и предотвращает неконтролируемый рост потребления памяти.

С помощью PHP INI-директивы memory_limit можно установить максимальный объем памяти, разрешённый для использования одним запросом. При превышении этого предела выполнение останавливается.

memory_limit является директивой INI_ALL, то есть её можно изменить в файлах php.ini, передавая значения INI исполняемому файлу PHP и используя ini-set вызовы функций. Установка значения в -1 снимает данное ограничение и позволяет скрипту использовать столько памяти, сколько необходимо, пока операционная система не завершит процесс.

Для более точного контроля над этим ограничением в PHP 8.5 введена новая INI директива max_memory_limit. По умолчанию она установлена в -1, то есть это ограничение по умолчанию отключено. max_memory_limit является INI_SYSTEM INI директивой, а значит, она не может быть изменена во время выполнения.

Когда задано значение max_memory_limit, оно становится максимальным значением, допустимым для настройки memory_limit в INI. Попытка установить более высокий предел вызывает предупреждение и устанавливает memory_limit на значение max_memory_limit.

max_memory_limit=256M
memory_limit=128M
ini_get('max_memory_limit'); // "256M";
ini_get('memory_limit'); // "128M";

При установке memory_limit во время выполнения, если новое значение меньше max_memory_limit или если max_memory_limit установлено в -1, вступает в силу новый предел памяти.

ini_set('memory_limit', '156M'); // Разрешено, меньше max_memory_limit 256M
ini_set('memory_limit', '256M'); // Разрешено, равно max_memory_limit 256M

Попытка установить более высокое значение memory_limit или отключить его, установив memory_limit равным -1, приводит к установке предела памяти равным max_memory_limit и выдаче предупреждения:

ini_set('memory_limit', '300M');

// Warning: Failed to set memory_limit to 314572800 bytes. Setting to max_memory_limit instead (currently: 268435456 bytes) in ... on line ...
ini_set('memory_limit', '-1');

// Warning: Failed to set memory_limit to unlimited. memory_limit (currently: 268435456 bytes) cannot be set to unlimited if max_memory_limit (%d bytes) is not unlimited in ...

Влияние на обратную совместимость

Новая директива PHP 8.5 max_memory_limit со значением по умолчанию -1, которое фактически отключает это ограничение. Установка данной INI-директивы в старых версиях PHP не имеет эффекта и не вызывает никаких предупреждений или уведомлений.

В старых версиях PHP ini_get('max_memory_limit') возвращает false.

В PHP 8.5 и более поздних версиях PHP приложениях, устанавливающих memory_limit во время выполнения, может потребоваться проверка max_memory_limit перед установкой более высокого значения memory_limit, чтобы избежать предупреждения PHP.

Комментарии


Дополнительные материалы

Предыдущая Статья

PHP 8.5: новое поведение Filter — исключения при сбоях валидации

Следующая Статья

PHP 8.5: новая Curl-функция curl_multi_get_handles — как она работает