Ответ 1
Я попытался добавить ob_flush() и, похоже, работает. Вот мой код:
public function streamedAction()
{
$response = new StreamedResponse();
$response->setCallback(function () {
echo 'Hello World';
ob_flush();
flush();
sleep(3);
echo 'Hello World';
ob_flush();
flush();
});
return $response;
}
Это возвращает chunked заголовок кодировки передачи с chunked данными. Вот результат:
$ telnet localhost 80
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET /app_dev.php/streamed HTTP/1.1
Host: symfony21.localdomain
HTTP/1.1 200 OK
Date: Wed, 12 Sep 2012 05:34:12 GMT
Server: Apache/2.2.17 (Unix) DAV/2 mod_ssl/2.2.17 OpenSSL/0.9.8o
cache-control: no-cache, private
x-debug-token: 50501eda7d437
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
b
Hello World
b
Hello World
0
Connection closed by foreign host.
Если вы увидите этот ответ в браузере, он отобразит "HelloWorldHelloWorld" примерно через 3 секунды после того, как браузер будет ждать, пока все chunked данные будут получены, поскольку Content-Type - это текст /*, но когда вы видите сетевой поток, на самом деле делает потоковое вещание, отправив данные с каналами.