【问题标题】:Streaming a Response in Symfony2在 Symfony2 中流式传输响应
【发布时间】:2012-09-05 00:53:21
【问题描述】:

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

}

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

【问题讨论】:

  • flush()之前尝试ob_flush()
  • 我试过以防万一,但这不起作用,因为没有ob_start()。它也不适用于ob_startob_flush
  • 我认为您可能将 php.ini 中的 output_buffering 设置为 4096,而某些默认 php.ini 具有。
  • 就我而言,ob_flush() 确实解决了这个问题。你如何测试它?你知道浏览器不会在第一个之后 3 秒显示第二个 Hello World 吗?你需要通过 telnet 或者 netcat 什么的来测试一下
  • 好的!你能发表回复,我会接受。您介意添加一些有关 telnet 或使用方式的信息吗?那将是真棒。谢谢@mask8

标签: symfony symfony-2.1


【解决方案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;
}

这将返回带有分块数据的分块传输编码标头。这是结果的输出:

$ 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/*,但是当您看到网络流时,它实际上是通过发送分块数据进行流式传输。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多