Запись

Allowed memory size exhausted в PHP: как найти причину и исправить ошибку

Пошаговая инструкция по ошибке Allowed memory size exhausted: что означают байты в сообщении PHP, где изменить memory_limit и что проверить, если увеличение памяти не помогает.

Allowed memory size exhausted

Ошибка Allowed memory size exhausted означает, что PHP-скрипт попытался использовать больше оперативной памяти, чем ему разрешено настройкой memory_limit. В результате PHP прекращает выполнение скрипта, а пользователь может увидеть Fatal error, белую страницу, ошибку 500 или сообщение о критической ошибке сайта.

Чаще всего проблему пытаются решить простым увеличением memory_limit. Иногда этого действительно достаточно. Но если причиной стал неисправный плагин, бесконечный цикл, слишком большая выборка из базы данных или загрузка огромного файла в память, увеличение лимита только временно скрывает проблему.

В этой инструкции разберём, что означает Allowed memory size of bytes exhausted, как определить текущий лимит PHP, увеличить его разными способами и что делать, если ошибка возвращается даже после увеличения памяти.

Что означает Allowed memory size exhausted

Типичная ошибка выглядит примерно так:

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes) in /home/site/public_html/example.php on line 125

У PHP есть ограничение на максимальный объём памяти, который может использовать один выполняющийся скрипт. Оно задаётся параметром memory_limit.

Например, если установлено:

memory_limit = 128M

PHP-процесс сможет использовать примерно 128 МБ. Когда скрипту понадобится больше, его выполнение будет остановлено с ошибкой Allowed memory size exhausted.

Важно: это не обязательно означает, что на сервере закончилась физическая оперативная память. На сервере может быть свободно несколько гигабайт RAM, но конкретному PHP-процессу разрешено использовать только 128 или 256 МБ.

Как читать Allowed memory size of bytes exhausted

Разберём сообщение:

Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes)

134217728 bytes - установленный лимит памяти.

tried to allocate 20480 bytes - объём дополнительной памяти, который PHP попытался получить непосредственно перед остановкой.

Последнее число часто понимают неправильно. Если PHP пишет tried to allocate 20480 bytes, это не значит, что сайту не хватило всего 20 КБ. На момент ошибки процесс уже практически исчерпал весь разрешённый объём памяти.

Как перевести байты в мегабайты

Чтобы перевести указанное PHP число в мегабайты, разделите его на 1 048 576.

Число в ошибке Лимит памяти
33554432 32 МБ
67108864 64 МБ
134217728 128 МБ
268435456 256 МБ
536870912 512 МБ
1073741824 1 ГБ

Почему возникает PHP Allowed memory size exhausted

Причины можно разделить на две основные группы: PHP действительно выделено слишком мало памяти либо конкретный скрипт потребляет ненормально большой объём памяти.

Низкий memory_limit

На хостинге может быть установлен лимит 64 или 128 МБ. Для простого сайта этого достаточно, но CMS, интернет-магазину, импорту товаров, резервному копированию или обработке изображений может потребоваться больше.

Плагин или модуль потребляет слишком много памяти

Если ошибка появилась сразу после установки или обновления расширения, причиной может быть именно оно. Особенно это характерно для плагинов импорта, резервного копирования, SEO-анализа, конструкторов страниц и модулей работы с большими каталогами.

Бесконечный цикл или рекурсия

Ошибка в PHP-коде может постоянно создавать новые данные:

$data = []; while (true) { $data[] = str_repeat('x', 10000); }

Увеличение memory_limit здесь ничего принципиально не исправит. Скрипт просто будет работать дольше, после чего снова займёт всю доступную память.

Слишком большая выборка из базы данных

Типичная причина - получение десятков или сотен тысяч строк SQL-запросом и загрузка результата целиком в массив PHP.

Например, вместо обработки всех товаров магазина одним запросом безопаснее получать их пакетами по 500–1000 записей.

Импорт большого CSV, XML или JSON

Если файл загружается функцией file_get_contents(), он целиком помещается в память. После разбора XML или JSON расход памяти может стать ещё выше, поскольку PHP создаёт дополнительные структуры данных.

Большие файлы лучше читать потоково или частями.

Обработка больших изображений

Размер JPEG, PNG или WebP на диске не равен объёму памяти, необходимому для обработки изображения. При декодировании картинка разворачивается в памяти, а при создании нескольких размеров одновременно могут существовать несколько её копий.

Поэтому изображение размером всего несколько мегабайт может потребовать десятки или сотни мегабайт RAM.

Резервное копирование и cron

Сайт может открываться нормально, но ошибка появляться только при создании резервной копии, формировании YML-фида, импорте каталога, запуске cron или фоновой индексации.

Это хороший диагностический признак: искать причину нужно именно в конкретной задаче, а не во всей CMS.

Как проверить текущий memory_limit PHP

Через PHP

Создайте временный файл, например memory-test.php:

<?php echo ini_get('memory_limit');

Откройте его в браузере. Например, результат:

256M

означает лимит 256 МБ.

После проверки удалите файл.

Через phpinfo()

Можно временно создать:

<?php phpinfo();

На странице найдите параметр memory_limit.

Обратите внимание на два значения: Local Value и Master Value. Локальная конфигурация сайта может отличаться от глобальной серверной.

Файл phpinfo() после диагностики обязательно удалите: он раскрывает техническую информацию о конфигурации сервера.

Через SSH

Если есть доступ к командной строке:

php -r "echo ini_get('memory_limit'), PHP_EOL;"

или:

php -i | grep memory_limit

Но учитывайте, что PHP CLI и PHP, обслуживающий сайт через PHP-FPM или Apache, могут использовать разные конфигурационные файлы. Поэтому результат команды по SSH не всегда совпадает со значением на сайте.

Как увеличить PHP memory_limit

Через панель хостинга

Это предпочтительный вариант для виртуального хостинга. Откройте настройки PHP выбранного сайта, найдите memory_limit и установите, например:

256M

Для тяжёлого интернет-магазина, импорта или резервного копирования может потребоваться:

512M

Сразу увеличивать лимит до нескольких гигабайт без диагностики не стоит.

Через php.ini

Найдите строку:

memory_limit = 128M

и измените её, например, на:

memory_limit = 256M

или:

memory_limit = 512M

На VPS или выделенном сервере после изменения конфигурации может потребоваться перезапуск PHP-FPM.

Через .user.ini

При использовании PHP-FPM на многих хостингах можно создать в корне сайта файл .user.ini:

memory_limit = 256M

Изменение может применяться с небольшой задержкой из-за кэширования пользовательских INI-настроек.

Через .htaccess

На некоторых конфигурациях Apache используется:

php_value memory_limit 256M

Но этот способ подходит не всегда. При PHP-FPM или FastCGI подобная директива может не работать или вызвать 500 Internal Server Error.

Если после изменения .htaccess сайт перестал открываться, удалите добавленную строку и используйте панель хостинга, php.ini или .user.ini.

Через PHP-скрипт

Иногда лимит можно изменить непосредственно в коде:

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

Но сервер может запретить изменение параметра на этом уровне. Кроме того, такой способ влияет только на выполнение конкретного скрипта.

Как убедиться, что новое значение применилось

После изменения снова проверьте:

<?php echo ini_get('memory_limit');

Если вы указали 512M, а PHP продолжает показывать 128M, значит изменяется не тот конфигурационный файл либо хостинг устанавливает собственное ограничение.

Allowed memory size exhausted в WordPress

В WordPress ошибка может появляться при работе редактора, WooCommerce, импорте товаров, обновлении плагинов, создании резервной копии или обработке изображений.

В файле wp-config.php можно определить:

define('WP_MEMORY_LIMIT', '256M');

Для административных операций WordPress предусмотрен отдельный максимальный лимит:

define('WP_MAX_MEMORY_LIMIT', '512M');

Например:

define('WP_MEMORY_LIMIT', '256M'); define('WP_MAX_MEMORY_LIMIT', '512M');

Однако эти константы не позволяют обойти жёсткое ограничение хостинга. Если PHP на сервере разрешено использовать максимум 128 МБ, запись 512M в wp-config.php не обязательно даст WordPress реальные 512 МБ.

Ошибка появилась после установки плагина

Если сообщение содержит путь:

/wp-content/plugins/plugin-name/...

и проблема появилась после установки или обновления этого плагина, временно отключите его.

Если войти в админку невозможно, подключитесь через FTP или файловый менеджер, откройте:

/wp-content/plugins/

и временно переименуйте папку проблемного плагина, например:

plugin-name → plugin-name-disabled

WordPress перестанет загружать расширение. Если сайт снова заработал, нужно разбираться с самим плагином, его настройками или конфликтом с другими расширениями.

Allowed memory size exhausted в Bitrix

В 1С-Битрикс ошибка часто возникает при обмене с 1С, импорте каталога, переиндексации, обработке изображений, выполнении агентов и работе тяжёлых компонентов.

Сначала проверьте реальный memory_limit PHP и только затем увеличивайте его.

Если ошибка появляется при обмене с 1С, проверьте размер импортируемого XML, количество товаров и торговых предложений в одном пакете, изображения, пользовательские обработчики событий и дополнительные модули, запускающиеся при сохранении элементов каталога.

Большой каталог Bitrix

Плохая схема:

получить 100000 товаров → сохранить всё в массив → начать обработку

Более безопасная:

получить 500 товаров → обработать → освободить данные → получить следующие 500

Пакетная обработка уменьшает расход памяти и делает импорт устойчивее.

Проблема появилась после доработки Bitrix

Проверьте запросы к инфоблокам, ORM и пользовательские обработчики событий. Не выбирайте лишние поля и не загружайте десятки тысяч элементов в один PHP-массив, если данные можно обработать последовательно.

Что делать, если увеличение memory_limit не помогло

Допустим, сначала PHP выдавал ошибку при 128 МБ. Вы установили 256 МБ, затем 512 МБ, но Allowed memory size exhausted снова появилась.

В такой ситуации дальнейшее увеличение лимита чаще всего не является правильным решением.

1. Определите, что изменилось перед появлением ошибки

Проверьте обновления CMS, установку новых плагинов, изменение темы, новый импорт, рост каталога, изменение версии PHP, запуск нового cron-скрипта и последние доработки кода.

2. Изучите путь к файлу

Например:

in /home/site/public_html/wp-content/plugins/importer/import.php on line 412

Если путь ведёт в конкретный плагин или пользовательский модуль, начните диагностику с него.

При этом файл из сообщения не всегда является непосредственной причиной. PHP мог расходовать память постепенно, а указанная строка оказалась всего лишь местом последней неудачной попытки выделения памяти.

3. Проверьте error_log

Посмотрите не только последнюю ошибку, но и записи непосредственно перед ней. Повторяющиеся сообщения, одинаковые запросы или предупреждения могут указывать на цикл.

4. Отключите подозрительные расширения

Если проблема появилась после обновления CMS или плагина, временно отключайте потенциально проблемные расширения и после каждого изменения повторяйте действие, вызывающее ошибку.

5. Проверьте зависимость от объёма данных

Если импорт 1000 товаров работает, а импорт 100 000 товаров вызывает Allowed memory size exhausted, причина практически наверняка связана с алгоритмом обработки большого массива данных.

6. Разбейте операцию на части

Для импорта, экспорта, массового обновления товаров и других больших задач применяйте пакетную обработку.

Например, вместо загрузки 50 000 записей сразу обрабатывайте по 500 или 1000 записей за проход.

Как найти утечку памяти в PHP

Для диагностики можно использовать встроенные функции PHP.

Текущее потребление памяти

echo memory_get_usage(true);

Максимальное потребление памяти

echo memory_get_peak_usage(true);

Вывод в мегабайтах:

echo round(memory_get_peak_usage(true) / 1024 / 1024, 2) . ' MB';

Если поставить такие замеры до и после подозрительных участков программы, можно определить место резкого роста потребления памяти.

Осторожнее с fetchAll()

Конструкция:

$rows = $statement->fetchAll();

может загрузить в память весь результат SQL-запроса.

Для больших выборок лучше обрабатывать строки последовательно:

while ($row = $statement->fetch()) { // обработка строки }

Не загружайте огромные файлы целиком

Вместо:

$data = file_get_contents($largeFile);

для текстового файла можно использовать:

$handle = fopen($largeFile, 'r'); while (($line = fgets($handle)) !== false) { // обработка строки } fclose($handle);

Освобождайте ненужные большие массивы

unset($bigArray);

Это не исправляет плохой алгоритм, но позволяет PHP раньше освободить структуры данных, которые больше не нужны.

Стоит ли устанавливать memory_limit = -1

Настройка:

memory_limit = -1

снимает ограничение памяти PHP.

Использовать её как постоянное решение на рабочем сайте нежелательно. Если скрипт содержит бесконечный цикл или утечку памяти, он сможет занять значительно больше ресурсов и уже повлиять на работу всего сервера.

Безопаснее установить разумный предел, например 256 или 512 МБ, а затем устранить источник чрезмерного расхода памяти.

Типичные ошибки при исправлении

Постоянное увеличение memory_limit

Если скрипту уже не хватает 512 МБ или 1 ГБ, нужно выяснить, почему он использует столько памяти.

Редактирование неправильного php.ini

На сервере могут одновременно работать разные версии PHP и отдельные конфигурации для CLI и PHP-FPM. Поэтому всегда проверяйте применившееся значение непосредственно через сайт.

Путаница RAM и дискового пространства

Наличие 100 ГБ свободного места на SSD никак не решает ошибку Allowed memory size exhausted. Речь идёт об оперативной памяти PHP-процесса.

Считать виноватой последнюю строку ошибки

Файл и строка показывают место, где PHP окончательно не смог получить память. Источник повышенного расхода мог находиться в другом участке программы.

Использование php_value на неподходящем сервере

Директива php_value memory_limit в .htaccess работает не на всех конфигурациях и при PHP-FPM может привести к ошибке 500.

Какой memory_limit установить

Единого значения для всех сайтов нет.

Для небольшого проекта может хватать 128–256 МБ. Для WordPress с большим количеством плагинов, WooCommerce, OpenCart, Bitrix, тяжёлого импорта или административных операций может потребоваться 256–512 МБ.

Но есть важный принцип: если обычная страница сайта стабильно требует около 1 ГБ памяти, это повод искать техническую проблему, а не просто увеличивать лимит.

Частые вопросы

Что означает PHP Fatal error Allowed memory size exhausted?

PHP-скрипт достиг максимально разрешённого значения memory_limit и попытался получить дополнительную память. PHP остановил его выполнение.

Что означает Allowed memory size of bytes exhausted?

Число перед bytes exhausted показывает установленный предел памяти в байтах. Например, 134217728 байт - это 128 МБ.

Как быстро исправить Allowed memory size exhausted?

Проверьте текущее значение memory_limit и попробуйте увеличить его, например, с 128 до 256 МБ. Если ошибка повторяется при значительно большем лимите, нужно искать причину чрезмерного расхода памяти.

Где изменить memory_limit?

В панели управления хостингом, php.ini, .user.ini, иногда в .htaccess или непосредственно в PHP-коде через ini_set(). Конкретный способ зависит от конфигурации сервера.

Почему поставил 512M, а ошибка всё равно пишет 128 МБ?

Скорее всего, изменён не тот конфигурационный файл, настройка не применяется для PHP-FPM либо хостинг устанавливает собственное ограничение. Проверьте фактическое значение через ini_get('memory_limit').

Может ли плагин WordPress вызывать ошибку памяти?

Да. Особенно если проблема появилась сразу после установки или обновления плагина. Его можно временно отключить и повторить проблемную операцию.

Как исправить Allowed memory size exhausted Bitrix?

Проверьте PHP memory_limit. Если ошибка связана с импортом или обменом с 1С, дополнительно проверяйте размер пакетов данных, пользовательские обработчики, запросы к инфоблокам, обработку изображений и фоновые задачи.

Почему ошибка возникла внезапно, хотя сайт раньше работал?

Причиной может быть увеличение базы данных или каталога, обновление плагина, новая версия CMS или PHP, изменение кода, рост размера импортируемых файлов либо новая фоновая задача.

Нужно ли устанавливать memory_limit = -1?

На рабочем сайте обычно нет. Неограниченная память может превратить ошибку одного скрипта в проблему для всего сервера. Лучше найти причину повышенного потребления.

Итог

Allowed memory size exhausted означает, что PHP-процесс достиг установленного лимита памяти. Если memory_limit действительно слишком мал, проблему можно решить его увеличением.

Но если ошибка возвращается после повышения лимита до 256, 512 МБ или выше, необходимо искать причину: неисправный плагин, бесконечный цикл, крупный SQL-запрос, импорт большого файла, обработку изображений или загрузку огромного массива данных.

Правильный порядок действий: проверить реальный memory_limit, изучить полный текст ошибки и PHP-логи, определить проблемную операцию, а затем уже менять настройки или оптимизировать код. Так можно устранить не только само сообщение Fatal error, но и причину чрезмерного расхода памяти.

Нужна помощь с похожей задачей?

Пришлите ссылку на сайт и кратко опишите задачу — я посмотрю и предложу следующий шаг.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *