12

ドキュメントからこの例を試しています: Streaming a Response in Symfony2

/**
 * @param Request $request
 * @return Response $render
 * @Route("/streamedResponse", name="streamed_response")
 * @Template("AcmeTestBundle::streamedResponse.html.twig")
 */
public function streamedResponseAction(Request $request)
{
    $response = new StreamedResponse();
    $response->setCallback(function () {
        echo 'Hello World';
        flush();
        sleep(3);
        echo 'Hello World';
        flush();
    });

    return $response;

}

これにより、すべてが同時に出力されます。私は何か間違ったことをした?

4

1 に答える 1

21

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;
}

これにより、チャンク化されたデータを含むチャンク化された転送エンコーディングヘッダーが返されます。結果の出力は次のとおりです。

$ 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.

ブラウザでこの応答を見ると、約3秒の読み込み後に「HelloWorldHelloWorld」と表示されます。これは、Content-Typeがtext / *であるため、すべてのチャンクデータが受信されるまでブラウザが待機するためですが、ネットワークストリームを見ると、実際にはチャンク化されたデータを送信することによるストリーミング。

于 2012-09-12T05:40:54.293 に答える