PHP на сервере PHPWordPressLinux Allowed memory sizememory_limit

PHP: «Allowed memory size of … bytes exhausted» — как исправить

  • Обновлено
  • Чтение ≈ 4 минуты

Краткий ответ

Fatal error: Allowed memory size of N bytes exhausted (tried to allocate M bytes) означает, что PHP-скрипт превысил лимит памяти, заданный memory_limit. Причина — либо лимит слишком мал для задачи, либо код расходует память неоправданно: бесконечный цикл или рекурсия, загрузка огромного набора данных целиком, тяжёлый плагин. Прежде чем поднимать лимит, найдите файл и строку из сообщения: иногда это ошибка в коде, а не нехватка памяти.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Как проверить результат
  5. Если не помогло

#Что означает ошибка

Allowed memory size exhausted
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes) in /var/www/site/index.php on line 42
По-русскиФатальная ошибка: разрешённый объём памяти (134217728 байт = 128 МБ) исчерпан при попытке выделить ещё 20480 байт.

Директива 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 именно той среды, где ошибка.

#Пошаговое решение

  1. Прочитайте файл и строкуНайдите полное сообщение Allowed memory size of ... bytes exhausted в журнале PHP или журнале приложения. Запишите имя файла и номер строки, размер указанного лимита и операцию, при которой это случилось (импорт, генерация отчёта, загрузка изображения). Перед правкой сохраните копию затронутого файла или конфигурации. Число после tried to allocate — это размер последнего запрошенного участка, а не общий объём потребления. Если ошибка возникает на любом объёме данных, ищите бесконечный цикл или повторную загрузку набора, а не только увеличивайте память.
  2. Проверьте лимитОпределите, какая версия PHP обрабатывает именно ошибочный запрос. Для командной строки выполните php -v и php -i | grep memory_limit на Linux либо php -i | findstr memory_limit в Windows — это только CLI. Для веб-сайта проверьте активную версию и ограничения нужного пула PHP-FPM в панели хостинга и его конфигурации; настройки CLI могут отличаться. Если временно используете phpinfo(), ограничьте к нему доступ и сразу удалите проверочный файл, поскольку он раскрывает параметры сервера. Запишите текущую директиву memory_limit и возможные пределы контейнера/пула.
  3. Оцените потреблениеЕсли есть доступ к коду, определите, не загружает ли запрос весь массив или таблицу одновременно. Включите подробный журнал в тестовой среде и добавьте временные записи memory_get_usage(true) и memory_get_peak_usage(true) до и после подозрительного участка. Для PDO замените fetchAll() на построчную обработку при подходящем драйвере; для больших файлов используйте потоковое чтение; для изображений проверяйте реальные размеры растра. Если память растёт бесконечно, исправьте логику и протестируйте на копии данных: повышение лимита лишь отложит падение.
  4. Увеличьте лимитТолько если операция объективно требует больше памяти и сервер располагает запасом, администратор может повысить memory_limit для нужной среды: например, с 128M до 256M в конфигурации конкретного PHP-FPM-пула или панели хостинга. Сохраните предыдущее значение, проверьте конфигурацию и согласованно перезагрузите соответствующий PHP-FPM, не все службы без необходимости. Учитывайте число параллельных процессов: лимит применяется к каждому процессу PHP, а общий расход может превысить RAM. Повторите исходный запрос и посмотрите журнал и пиковую память; не задавайте -1 на рабочем сайте.
  5. Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
    Выберите подходящий вариант — это не команды для последовательного выполнения
    Вариант 1Диагностика только CLI на Linux; для Windows замените grep на findstr.
    Linux · Терминал (Bash)Команда
    Диагностика только CLI на Linux; для Windows замените grep на findstr. Настройки сайта в PHP-FPM могут отличаться.
    php --ini
    php -v
    php -i | grep -i memory_limit
    Вариант 2Путь зависит от системы: например, /etc/php/8.3/fpm/php.ini для PHP-FPM в Debian/Ubuntu.
    php.ini
    Путь зависит от системы: например, /etc/php/8.3/fpm/php.ini для PHP-FPM в Debian/Ubuntu. После правки перезапустите PHP-FPM.
    memory_limit = 256M
    Вариант 3Генератор отдаёт строки по одной — память не растёт с размером таблицы.
    пример порционной обработки
    Генератор отдаёт строки по одной — память не растёт с размером таблицы.
    <?php
    function rows(PDO $pdo): Generator {
        $st = $pdo->query('SELECT * FROM big_table');
        while ($row = $st->fetch(PDO::FETCH_ASSOC)) {
            yield $row;   // по одной строке, без загрузки всей таблицы
        }
    }

В WordPress для лимита, который использует сама система, можно задать в wp-config.php: define('WP_MEMORY_LIMIT', '256M');. Но если лимит упирается в memory_limit сервера, поднимать нужно и его.

#Как проверить результат

  • Тяжёлая операция выполняется без фатальной ошибки.
  • Потребление памяти не растёт линейно с размером данных.
  • В журнале ошибок PHP нет новых записей Allowed memory size.

#Если не помогло

Включите профилирование (например, Xdebug или memory_get_peak_usage()) в проблемном месте и найдите, какой участок растёт. Для CMS отключите плагины по одному и посмотрите, при каком исчезает ошибка. Если нагрузка выросла, возможно, нужен более мощный тариф или оптимизация запросов.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 1 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.