PHP 8.5: Новая INI директива max_memory_limit задающая верхний предел memory_limit
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=128Mini_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.