在Symfony2中流式传输响应

12
我正在尝试文档中的这个示例: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;

}

这会将所有内容同时输出。我做错了什么吗?

1
在调用 flush() 之前尝试使用 ob_flush() - mask8
我尝试了使用in case,但是由于没有ob_start(),所以这并不起作用。同时,使用ob_startob_flush也无法解决问题。 - Mick
1
我认为你可能在php.ini中设置了output_buffering为4096,这是一些默认的php.ini文件所具有的。 - mask8
2
在我的情况下,ob_flush() 确实解决了这个问题。你是怎么测试的?你知道浏览器不会在第一个 Hello World 3 秒后显示第二个吧?你需要通过 telnet 或 netcat 等方式进行测试。 - mask8
好的!您可以回复并我会接受它。您介意添加一些关于telnet或您使用它的方式的信息吗?那将非常棒。谢谢@mask8 - Mick
1个回答

23

我尝试添加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 / *,但当您查看网络流时,实际上正在发送分块数据进行流式传输。


@mask8 你知道如何使用Symfony测试客户端编写针对流内容的功能测试吗?我在这里提出了一个问题:如何使用Symfony测试客户端检索流响应 - Lorenzo Polidori

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接