В laravel у меня есть запрос, который ищет тысячи строк в базе данных, и я пытаюсь скомпилировать его в файл CSV. Пытаясь сократить использование памяти, я получаю 500 строк за раз и выдаю CSV.
$callback = function () use ($query) {
$file = fopen('php://output', 'w');
$query->chunk(500, function ($rows) use ($file) {
foreach ($rows as $key => $row) {
fputcsv($file, array_map(...$rows...));
}
log_info("Memory used " . memory_get_usage());
});
fclose($file);
};
$headers = [ ... ];
return response()->stream($callback, 200, $headers);
Реальный запрос немного сложнее и включает в себя получение связанных моделей, которые также необходимо обновить. Когда я запускаю это, он начинает генерировать файл CSV, и через некоторое время ему не хватает памяти. Это в моем журнале
(59): Memory used 17208328;
(59): Memory used 25105328;
(59): Memory used 30601328;
...
(59): Memory used 127380496;
(59): Memory used 129352584;
(59): Memory used 131207672;
[2025-11-23 23:50:15] qa.ERROR: Allowed memory size of 134217728 bytes exhausted (tried to allocate 16384 bytes)
Что я пробовал
Я попробовал поместить следующее внутрь цикла фрагментов, надеясь, что это освободит память. На потребление памяти это не повлияло.
unset($rows);
flush();
gc_collect_cycles();
Подробнее здесь: https://stackoverflow.com/questions/798 ... emory-leak