Потоковая передача (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