Класс StreamedResponse
Класс StreamedResponse представляет HTTP-ответ,
содержимое которого генерируется постепенно с помощью
callback-функции. Вместо готовой строки ответа класс
принимает замыкание, которое получает поток вывода и
записывает в него данные по частям. Первым параметром
передаётся callback, вторым - код статуса, третьим -
заголовки. Такой подход полезен для выгрузки больших
файлов, генерации отчётов и передачи данных в реальном
времени, так как не требует хранить весь контент в памяти.
Синтаксис
new StreamedResponse(callable $callback = null, int $status = 200, array $headers = [])
Пример
Давайте создадим потоковый ответ, который выводит строки по одной:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationStreamedResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/stream', name: 'article_stream')]
public function stream(): StreamedResponse
{
$res = new StreamedResponse(function () {
echo 'abcde';
echo 'article';
echo 'hello';
});
return $res;
}
}
?>
Результат выполнения кода:
abcdearticlehello
Пример
Давайте передадим в поток данные из массива и сбросим буфер после каждой строки:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationStreamedResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/stream-array', name: 'article_stream_array')]
public function streamArray(): StreamedResponse
{
$res = new StreamedResponse(function () {
$items = ['abcde', 'article', 'user', 'hello'];
foreach ($items as $item) {
echo $item . "\n";
flush();
}
});
return $res;
}
}
?>
Результат выполнения кода:
abcde
article
user
hello
Пример
Давайте зададим код статуса и заголовок типа контента:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationStreamedResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/stream-text', name: 'article_stream_text')]
public function streamText(): StreamedResponse
{
$res = new StreamedResponse(function () {
echo 'abcde';
}, 200, ['Content-Type' => 'text/plain']);
return $res;
}
}
?>
Результат выполнения кода:
abcde
Смотрите также
-
класс
Response,
который представляет обычный HTTP-ответ -
класс
BinaryFileResponse,
который отдаёт бинарный файл в ответе -
метод
sendContent,
который отправляет содержимое ответа клиенту -
метод
send,
который отправляет заголовки и содержимое ответа