Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Що означає помилка Allowed memory size exhausted і як з нею боротися?

Fatal error: Allowed memory size of 134217728 bytes exhausted означає, що скрипт спробував використати більше пам'яті, ніж дозволяє налаштування memory_limit (тут 128 МБ). PHP зупиняє виконання, щоб один запит не з'їв пам'ять усього сервера.

Типові причини:

  • Усе завантажено одразу: User::all() на мільйоні рядків, file() для великого файлу, json_decode великої відповіді API.
  • Накопичення в циклі: масив, у який дописують результати обробки сотень тисяч записів.
  • Нескінченна рекурсія чи цикл, що безкінечно додає елементи.
  • Витік у довгому процесі: воркер черги, що накопичує дані між завданнями.

Як виправляти - не піднімати ліміт, а змінити підхід:

// Замість User::all()
User::query()->chunkById(1000, function ($users) {
    foreach ($users as $user) { /* ... */ }
});

// Або ліниво, по одному
foreach (User::query()->lazy() as $user) { /* ... */ }

// Великий файл - рядок за рядком
$file = new SplFileObject('huge.csv');
foreach ($file as $line) { /* ... */ }

Коли збільшити ліміт доречно: справді важка, але обмежена задача - генерація великого звіту в команді, обробка зображення. Тоді точково: ini_set('memory_limit', '512M') у конкретній команді, а не глобально для веб-запитів.

Поруч - max_execution_time: ліміт часу виконання (у CLI за замовчуванням вимкнений, для веб - зазвичай 30 с). Помилка Maximum execution time exceeded - сигнал перенести роботу в чергу.

Як знайти винуватця: memory_get_peak_usage(true) між етапами або профайлер (Xdebug, Blackfire, SPX).

Докладніше в документації: memory_limit

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання