#Симптомы, область применения и причины
После обновления темы, модуля или PHP сайт перестал открывать отдельные страницы с Fatal error: Allowed memory size exhausted. Как отличить рост расхода памяти от неверного memory_limit и исправить причину. В отличие от общей ошибки лимита памяти, здесь важно сравнить поведение до и после конкретного обновления: новый код, запросы к БД, размер выгружаемых данных и настройки того PHP, который обслуживает сайт.
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| В обновлённом коде выросло потребление памятиНовый импорт, создание миниатюр или выборка всех записей загружает большой массив в память. | Ошибка возникает только на новой странице или во время определённой операции; разные величины «tried to allocate». | Сузить операцию до одной выборки и проверить изменения версии. |
| Сменился активный php.ini или пулCLI и PHP-FPM читают разную конфигурацию, а после обновления сайта мог измениться обработчик. | В терминале memory_limit высокий, а HTTP-запрос падает при прежнем лимите. | Найти эффективный лимит именно через запрос сайта, затем изменить нужную конфигурацию. |
| Сервис упирается в память сервераРост количества воркеров и объёма каждого процесса приводит к нехватке ОЗУ, независимо от PHP-лимита. | В системных журналах есть OOM-killer, процессы аварийно завершаются. | Измерить расход памяти, не повышать лимит вслепую. |
#Безопасная диагностика и пошаговое исправление
- Зафиксируйте исходную ошибку и момент обновленияОткройте проблемную страницу в отдельном окне, запишите адрес, время и операцию (например, «сохранить карточку товара»). В панели размещения откройте журналы ошибок PHP; если панели нет, подключитесь к серверу по SSH и посмотрите error_log сайта, путь которого указан в настройках виртуального сервера или пула PHP-FPM. Ищите точную строку
Allowed memory size of ... bytes exhausted (tried to allocate ... bytes)и указанный файл со строкой. Не включайте показ ошибок посетителям: в журнале могут быть внутренние пути и сведения приложения.
- Сравните с работающей страницей и определите изменениеНа том же сайте выполните простое действие без загрузки больших данных и сравните время, число записей и используемые изображения. В истории развёртываний найдите дату выпуска новой версии и список изменённых модулей. Если ошибка началась после добавления импорта, ограничьте тест несколькими строками; если даже главная страница падает, проверьте новый обработчик PHP. Не удаляйте обновлённые файлы, пока не сохранена резервная копия.
- Определите эффективный лимит веб-запроса, а не только терминалаВ панели хостинга откройте параметры PHP конкретного домена и найдите
memory_limit; отдельно проверьте переопределение в пуле FPM,.user.iniи вызовыini_set. Разработчик может временно добавить в закрытый диагностический маршрутini_get("memory_limit"), ограничив доступ администраторам; после проверки его следует убрать. Если изменения в CLI не совпадают с браузером, это нормальный признак разных конфигураций, а не повод менять все найденные php.ini сразу. - Пример кода по темеPHPВставьте на время в обслуживаемый путь приложения, запустите только авторизованный тест и проверьте серверный журнал. Не показывайте эти сведения публично.
<?php // Запускать только в закрытом диагностическом маршруте; затем удалить. error_log('effective memory_limit: '.ini_get('memory_limit')); error_log('peak bytes: '.memory_get_peak_usage(true));
- Измерьте рост памяти на конкретной операцииВ тестовой среде запустите проблемное действие с контрольным объёмом данных. Добавьте журналирование
memory_get_usage(true)до и после чтения данных, построения изображения или сериализации ответа. Числа в байтах позволят найти участок с резким ростом. Для массива, содержащего все строки таблицы, применяйте порционную обработку (пагинацию, итераторы); для изображений проверяйте разрешение в пикселях, а не только размер файла. Если память растёт даже на пустом наборе, сопоставьте вызовы новых плагинов.
- Проверьте свободную память сервера до изменения ограниченийПодключитесь по SSH; откройте терминал, например PowerShell на Windows, и введите
ssh пользователь@серверс вашими реквизитами. На сервере выполнитеfree -h: это просмотр состояния памяти и подкачки, права администратора не нужны. Параметр-hпоказывает понятные единицы. Если доступной памяти мало либо в журнале есть записи об убийстве процессов по OOM, сначала снизьте параллельность тяжёлых задач и выясните нагрузку, иначе повышение memory_limit ухудшит ситуацию.Linux · Терминал (Bash)Только проверкаКоманда выполняется на Linux-сервере по SSH. Сравнивайте колонку available, а не только free.free -h
- Исправьте причину в новой версии до повышения memory_limitЕсли после обновления приложение запрашивает всю таблицу, ограничьте объём выборки и выполняйте обработку порциями. Если цикл накапливает промежуточные объекты, освобождайте их по завершении обработки и не сохраняйте большие копии массива. Изменения вносите через репозиторий или тестовую копию, сначала сохраните файлы и данные. Проверьте пробный запрос; если он опять падает на той же строке, вернитесь к измерению пиков, а не повышайте лимит бесконечно.
- Точечно скорректируйте лимит только при подтверждённой необходимостиКогда расчётный пик находится немного выше текущего предела и на сервере достаточно ОЗУ, в панели домена или активном пуле укажите разумное значение
memory_limit(например, переход 128M → 256M только для этого сайта). Сохраните прежнее значение. Для PHP-FPM запросите проверку конфигурации соответствующим исполняемым файлом версии и плавную перезагрузку только этой службы; в панели используйте штатное применение настроек. Для PHP 8.5 учитывайте возможные дополнительные верхние ограниченияmax_memory_limit, заданные администратором.
- Повторите операцию и предусмотрите откатОбновите проблемную страницу, выполните исходное действие с тем же количеством данных и найдите отсутствие новой записи Fatal error. Сравните время ответа и пиковую память, затем выполните ещё один запрос на фоне обычной нагрузки. Если память всё равно растёт, восстановите прежний
memory_limitи предыдущую стабильную версию проблемного модуля из проверенной резервной копии; зафиксируйте точные строки ошибок для разработчика.
#Как проверить результат и что делать дальше
Успех — воспроизводимая операция завершается без Fatal error, пик памяти не приближается к новому лимиту, в журнале нет OOM. При повторном переполнении сохраните лог со временем и именем файла без персональных данных, верните прежние параметры и передайте разработчику замеры. Изменение памяти в CLI само по себе ничего не доказывает о PHP-FPM.