Ошибка Allowed memory size of N bytes exhausted означает, что скрипту не хватило памяти: превышен лимит памяти PHP, заданный параметром memory_limit. Быстрое решение - поднять лимит в настройках хостинга или в файле .user.ini, и сайт оживёт. Правильное решение - найти, какая операция съедает память: чаще всего это выгрузки, обмен с 1С, обработка больших картинок или неоптимальный код, который тянет из базы всё подряд. Ниже - оба пути: скорая помощь за 10 минут и лечение причины.

Как читать ошибку. В строке «Allowed memory size of 268435456 bytes exhausted (tried to allocate ...) in /file.php on line N» есть всё: 268435456 байт - это лимит 256 мегабайт, а file.php и номер строки указывают на скрипт-обжору. Файл и строка - отправная точка диагностики, запишите их до любых правок.

Где появляется ошибка памяти PHP и почему именно там

Ошибка редко валит весь сайт: обычно падает конкретное действие. В интернет-магазинах на Битрикс это выгрузка каталога в Excel, обмен с 1С, переиндексация поиска, копирование раздела с сотнями товаров. На витрине - страницы с огромными выборками и генерация превью для фотографий по 10-20 мегапикселей. Если же сайт падает целиком и постоянно, память тут чаще ни при чём - смотрите разбор в статье про ошибку 500: у неё десяток причин, и лимит памяти лишь одна из них.

Как поднять memory_limit: три способа по порядку

  1. Панель хостингаСамый надёжный путь: в разделе настроек PHP найдите memory_limit и поставьте 256M или 512M. На большинстве белорусских хостингов это доступно даже на дешёвых тарифах.
  2. Файл .user.ini или php.iniЕсли панель не даёт менять параметр, создайте в корне сайта файл .user.ini со строкой memory_limit = 512M. Изменение подхватывается за пару минут.
  3. Настройки БитриксВ bitrix/php_interface/dbconn.php лимит иногда задан жёстко через ini_set - тогда правки хостинга не работают, пока не поправить это значение. Частая ловушка после переезда сайта.
Не поднимайте лимит бесконечно. 256M для Битрикс - норма, 512M - рабочий максимум для обменов. Если скрипт просит 1-2 гигабайта, это не повод их дать: прожорливый код положит сервер под первой же нагрузкой, а хостинг заблокирует сайт за превышение ресурсов. Гигабайтные аппетиты - всегда сигнал чинить код, а не настройку.

Ошибка памяти возвращается снова и снова?

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

Вылечить причину

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

  • Выборки без фильтра - код запрашивает из базы все товары разом вместо постраничной обработки
  • Обработка изображений - ресайз фотографии 8000 на 6000 пикселей требует сотни мегабайт, десяток таких в цикле - и лимит выбран
  • Обмен с 1С одним куском - файл выгрузки на сотни тысяч позиций разбирается в память целиком вместо порционной загрузки
  • Утечки в циклах - объекты копятся в массиве и не освобождаются, память растёт с каждой итерацией
  • Старые модули - написаны под каталог на 500 товаров и не рассчитаны на нынешние 50 000
Совет. После поднятия лимита проверьте скорость сайта: скрипты, которым мало 256 мегабайт, обычно и работают медленно, а тормоза стоят конверсии. Быстрая самопроверка - в статьях как ускорить сайт и про Google PageSpeed Insights.

Частые вопросы про лимит памяти PHP

Какой memory_limit нормален для сайта на Битрикс?
256M покрывает витрину и админку типового магазина, 512M ставят для обменов с 1С и импортов. Значения выше оправданы только точечно - для конкретного тяжёлого скрипта, а не для всего сайта. Постоянная потребность в гигабайте - повод для аудита кода.
Поднял memory_limit, а ошибка осталась. Почему?
Три типовые причины: лимит переопределён в другом месте (dbconn.php, .htaccess, настройки конкретного сайта в панели), хостинг режет память на уровне тарифа жёстче, чем разрешает менять настройку, или падает консольный PHP (обмены, агенты) - у него свой php.ini. Проверить фактический лимит можно функцией phpinfo.
Ошибка памяти появляется только при обмене с 1С. Что делать?
Поднять лимит для шага обмена (в Битрикс есть отдельная настройка размера порции в модуле обмена) и уменьшить размер пакета на стороне 1С. Если не помогает - обмен написан без порционной обработки, его нужно дорабатывать: это типовая задача, оцениваем по журналу обмена.
Может ли ошибка памяти быть признаком взлома сайта?
Да, изредка: вредоносные скрипты рассылки спама и майнеры жрут память и роняют сайт. Если ошибка появилась внезапно, без обновлений и правок, проверьте сайт по нашему списку признаков в статье «как понять, что сайт взломан».

Итог: превышение лимита памяти лечится за 10 минут настройкой, но по-настоящему решается только поиском обжоры в коде. Первое вы теперь сделаете сами, для второго есть мы: доработка сайтов на Битрикс - перепишем тяжёлые места, настроим обмены и лимиты. С 2013 года, 450+ проектов, смета в течение дня.