#Что означает ошибка
Fatal error: Allowed memory size exhausted
Fatal error: Allowed memory size of 134217728 bytes exhausted означает, что PHP-скрипт использовал больше памяти, чем разрешено директивой memory_limit. Число в сообщении — лимит в байтах (134217728 = 128 МБ), а во второй цифре указан размер запрошенной порции памяти, которая и превысила предел.
Типичные причины — обработка больших изображений и файлов, выборка в память огромных массивов данных из базы, тяжёлые плагины CMS и бесконечная рекурсия. Простое увеличение лимита помогает, но не устраняет «прожорливый» код.
Скрипт превысил memory_limit. Увеличьте лимит в php.ini, .htaccess или ini_set, либо оптимизируйте код и запросы.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Мал memory_limitЛимит. | Ошибка. | Увеличьте. |
| Тяжёлый запросДанные. | Большая выборка. | Постранично. |
| Утечка памятиЦикл. | Растёт. | Оптимизируйте. |
| Большие файлыЗагрузка. | Обработка. | Потоково. |
#Пошаговое решение
- Узнайте текущий лимитВ журнале PHP найдите
Allowed memory size of N bytes exhaustedи конкретный файл/строку. В панели хостинга проверьте фактическийmemory_limitвеб-PHP, а не только CLI. Если это большой импорт или обработка изображений, зафиксируйте объём входных данных и наблюдаемый расход памяти. - Увеличьте memory_limitТолько если задача действительно должна потреблять больше памяти, администратор увеличивает
memory_limitдля нужного сайта/пула после расчёта RAM и числа воркеров. Значение вроде 256M — пример, не универсальная рекомендация. В PHPini_setможет быть запрещён и не поможет, если лимит задаётся пулом или панелью. - Перезапустите PHPПосле изменения php.ini/pool-конфигурации выполните проверку синтаксиса и перезагрузите нужную службу PHP-FPM в согласованное окно. Затем через закрытую диагностическую страницу проверьте новый
ini_get("memory_limit")и удалите её. Для PHP CLI проверяйте настройки отдельно. - Найдите причинуПрофилируйте проблемную операцию: чтение всего файла вместо потоковой обработки, большие массивы, рекурсия, бесконечное накопление объектов, тяжелые плагины. Повторите на тестовом наборе данных и проверьте пик памяти через
memory_get_peak_usage(true); повышение лимита без исправления утечки лишь отложит новый сбой.
#Как увеличить лимит
Измените memory_limit в php.ini (memory_limit = 256M) и перезапустите PHP-FPM/Apache. На хостинге лимит правится в панели; в WordPress можно добавить define('WP_MEMORY_LIMIT', '256M'); в wp-config.php. Для отдельного скрипта используйте ini_set('memory_limit', '512M'), если это разрешено хостингом.
#Как найти причину
В сообщении указан файл и строка, на которой превышен лимит. Проверьте, какие данные загружаются в память: используйте выборку частями (LIMIT/OFFSET, генераторы, курсоры), обработку файлов потоками. Измеряйте потребление через memory_get_peak_usage(). Для изображений ограничьте размер до обработки.
#Особые случаи
Различайте веб и CLI: у консольных скриптов (cron, artisan, wp-cli) может быть свой php.ini с другим лимитом. Лимит -1 снимает ограничение, но опасен: один скрипт займёт всю память сервера. Не применяйте его на рабочем сервере без ограничения по времени выполнения.
echo memory_get_peak_usage(true)/1048576 . " MB";ini_set("memory_limit", "256M");#Как проверить лимит на сервере
Выведите phpinfo() или выполните php -i | grep memory_limit и убедитесь, что изменение применилось к нужному окружению (веб или CLI). Если после правки php.ini значение прежнее, возможно, действует конфигурация пула PHP-FPM (php_admin_value) или файл .user.ini в каталоге сайта.