Потоковая передача (StreamedResponse)
Класс Imhotep\Http\StreamedResponse позволяет эффективно передавать данные клиенту частями, не загружая весь контент в память. Это незаменимо при работе с большими файлами, генерации отчётов "на лету" и потоковой передачи данных.
Базовый пример
Создайте StreamedResponse, передав callback-функцию, которая будет выводить данные:
use Imhotep\Http\StreamedResponse;
return new StreamedResponse(function () {
$handle = fopen('large-file.csv', 'r');
while (!feof($handle)) {
echo fread($handle, 8192); // Читаем и отправляем по 8 КБ
flush(); // Отправляем немедленно
// Если нужно отслеживать разрыв соединения
if (connection_aborted()) {
break;
}
}
fclose($handle);
});
PHP
Использование фабрики ответов
Метод streamDownload() предоставляет удобный способ организации скачивания больших файлов:
return response()->streamDownload(function () {
$handle = fopen('large-file.zip', 'r');
while (!feof($handle)) {
echo fread($handle, 8192);
flush();
if (connection_aborted()) {
break;
}
}
fclose($handle);
}, 'download.zip');
PHP
Для добавления пользовательских заголовков укажите их третьим параметром:
return response()->streamDownload(function () {
// Генерация данных
}, 'report.csv', [
'Content-Type' => 'text/csv',
'X-Custom-Header' => 'Value'
]);
PHP