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).