#Что означает ошибка
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes) in /var/www/site/index.php on line 42
Директива memory_limit ограничивает память, которую может использовать один запрос PHP. Значение в сообщении — текущий лимит в байтах (134217728 — это 128 МБ, 268435456 — 256 МБ). Число «tried to allocate» — лишь последняя порция, которая не поместилась, а не весь объём, нужный скрипту. Важнее путь к файлу и номер строки: они показывают, где память закончилась.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Лимит памяти слишком мал для задачиТяжёлая операция (импорт, обработка изображений, отчёт) честно требует больше памяти. | Ошибка стабильно возникает на одной тяжёлой операции; при небольших данных всё работает. | Разумно увеличьте memory_limit для нужной среды. |
| Бесконечный цикл или рекурсияОшибка в коде заставляет скрипт бесконечно накапливать данные. | Память заканчивается при любом размере данных; сообщение указывает на цикл или рекурсивную функцию. | Исправьте логику; поднятие лимита лишь отложит сбой. |
| Загрузка слишком большого набора данных в памятьКод читает весь файл, всю таблицу или ответ API разом. | Ошибка растёт вместе с размером данных; используется fetchAll, file() или file_get_contents на большом файле. | Обрабатывайте порциями: генераторы, LIMIT/OFFSET, потоковое чтение. |
| Тяжёлый плагин, тема или расширение CMSРасширение WordPress, Joomla или другой CMS потребляет много памяти. | Ошибка появилась после установки или обновления плагина; путь в сообщении ведёт в каталог плагина. | Отключите плагин, найдите причину, замените или обновите. |
Разные лимиты для CLI и веб-сервераВ консоли скрипт работает, а в браузере падает, потому что php.ini у FPM и CLI разные. | php -i показывает один лимит, а phpinfo() в браузере — другой. | Меняйте memory_limit в php.ini именно той среды, где ошибка. |
#Пошаговое решение
- Прочитайте файл и строкуНайдите полное сообщение
Allowed memory size of ... bytes exhaustedв журнале PHP или журнале приложения. Запишите имя файла и номер строки, размер указанного лимита и операцию, при которой это случилось (импорт, генерация отчёта, загрузка изображения). Перед правкой сохраните копию затронутого файла или конфигурации. Число послеtried to allocate— это размер последнего запрошенного участка, а не общий объём потребления. Если ошибка возникает на любом объёме данных, ищите бесконечный цикл или повторную загрузку набора, а не только увеличивайте память. - Проверьте лимитОпределите, какая версия PHP обрабатывает именно ошибочный запрос. Для командной строки выполните
php -vиphp -i | grep memory_limitна Linux либоphp -i | findstr memory_limitв Windows — это только CLI. Для веб-сайта проверьте активную версию и ограничения нужного пула PHP-FPM в панели хостинга и его конфигурации; настройки CLI могут отличаться. Если временно используетеphpinfo(), ограничьте к нему доступ и сразу удалите проверочный файл, поскольку он раскрывает параметры сервера. Запишите текущую директивуmemory_limitи возможные пределы контейнера/пула. - Оцените потреблениеЕсли есть доступ к коду, определите, не загружает ли запрос весь массив или таблицу одновременно. Включите подробный журнал в тестовой среде и добавьте временные записи
memory_get_usage(true)иmemory_get_peak_usage(true)до и после подозрительного участка. Для PDO заменитеfetchAll()на построчную обработку при подходящем драйвере; для больших файлов используйте потоковое чтение; для изображений проверяйте реальные размеры растра. Если память растёт бесконечно, исправьте логику и протестируйте на копии данных: повышение лимита лишь отложит падение. - Увеличьте лимитТолько если операция объективно требует больше памяти и сервер располагает запасом, администратор может повысить
memory_limitдля нужной среды: например, с128Mдо256Mв конфигурации конкретного PHP-FPM-пула или панели хостинга. Сохраните предыдущее значение, проверьте конфигурацию и согласованно перезагрузите соответствующий PHP-FPM, не все службы без необходимости. Учитывайте число параллельных процессов: лимит применяется к каждому процессу PHP, а общий расход может превысить RAM. Повторите исходный запрос и посмотрите журнал и пиковую память; не задавайте-1на рабочем сайте. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
В WordPress для лимита, который использует сама система, можно задать в wp-config.php: define('WP_MEMORY_LIMIT', '256M');. Но если лимит упирается в memory_limit сервера, поднимать нужно и его.
#Как проверить результат
- Тяжёлая операция выполняется без фатальной ошибки.
- Потребление памяти не растёт линейно с размером данных.
- В журнале ошибок PHP нет новых записей
Allowed memory size.
#Если не помогло
Включите профилирование (например, Xdebug или memory_get_peak_usage()) в проблемном месте и найдите, какой участок растёт. Для CMS отключите плагины по одному и посмотрите, при каком исчезает ошибка. Если нагрузка выросла, возможно, нужен более мощный тариф или оптимизация запросов.