#Что означает сообщение
Allowed memory size exhausted
Увеличьте memory_limit и найдите причину избыточного расхода памяти.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Малый лимит | Пиковое потребление близко к memory_limit | Оптимизировать и обоснованно увеличить лимит |
| Тяжёлый плагин | Ошибка появляется только на одном модуле | Профилировать его потребление |
| Утечка в коде | Память растёт с числом объектов без освобождения | Устранить неограниченное накопление |
| Большой массив | Загрузка всех строк SQL в один массив | Перейти на обработку порциями |
#Пошаговое решение
- Найдите процесс и точку перерасхода памятиВ журнале PHP найдите точную строку
Allowed memory size of ... bytes exhaustedи путь файла со строкой кода. Это лимитmemory_limitдля конкретного процесса PHP, а не сообщение о свободной памяти всего сервера. Уточните, ошибка возникает у веб-запроса, обработчика очереди или CLI: настройки у них могут отличаться. Временно добавьте в контролируемую отладкуmemory_get_peak_usage(true)и воспроизведите ошибку на тестовых данных. - Исключите ненужную загрузку больших массивовПросмотрите код указанной функции: не читает ли она весь файл через
file_get_contents, все строки SQL черезfetchAllили создаёт ли копии больших массивов. При возможности переходите на чтение порциями, генераторы, курсоры и ограничение запросов. Для изображений учтите память под несжатое растровое изображение, часто значительно превышающую размер JPEG на диске. Сначала устраните неограниченное накопление данных, затем решайте, нужен ли больший лимит. - Изменяйте memory_limit только для нужной средыУ администратора выясните активный конфигурационный файл через CLI
php --ini, но для сайта отдельно черезphpinfo()или настройки PHP-FPM. В нужномphp.ini/пуле установите обоснованныйmemory_limit, например256Mвместо128M, только если сервер имеет запас и известно число одновременных процессов. Перезапустите соответствующий пул по регламенту. Не устанавливайте-1без измерения: много PHP-процессов могут исчерпать RAM сервера. - Проверьте пиковое потребление и нагрузкуПовторите проблемную операцию и убедитесь, что запрос завершился, а пиковое потребление памяти остаётся ниже лимита с запасом. Проверьте журналы веб-сервера и PHP на повторные ошибки и системный журнал на убийство процессов по OOM. Если потребление растёт при каждом запросе, ищите утечку в коде и расширениях, а не бесконечно повышайте лимит.
#На что обратить внимание
Не ставьте memory_limit=-1 на публичном сайте как универсальное решение: это может исчерпать RAM при параллельных запросах. Для пакетных задач используйте обработку порциями и CLI.