Allowed memory size exhausted в PHP: как найти причину и исправить ошибку
Пошаговая инструкция по ошибке Allowed memory size exhausted: что означают байты в сообщении PHP, где изменить memory_limit и что проверить, если увеличение памяти не помогает.
Ошибка 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-коде может постоянно создавать новые данные:
Увеличение 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 предусмотрен отдельный максимальный лимит:
Однако эти константы не позволяют обойти жёсткое ограничение хостинга. Если 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.
Это не исправляет плохой алгоритм, но позволяет 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, но и причину чрезмерного расхода памяти.
Переработана структура каталога интернет-магазина на OcStore 1.5.6.4: карточки товаров получили постоянные URL и стабильные хлебные крошки, старые адреса перенаправляются через 301 Redirect, а отдельные товары теперь можно выводить в плитках категорий вместе с подкатегориями.
Переработал страницы онлайн-оплаты туров: убрал устаревшие даты и служебные элементы, сделал кнопку оплаты заметнее и создал единый шаблон для всех направлений.
Нужна помощь с похожей задачей?
Пришлите ссылку на сайт и кратко опишите задачу — я посмотрю и предложу следующий шаг.