【问题标题】:SSE not sending events until the script has finished executing?SSE 在脚本完成执行之前不发送事件?
【发布时间】:2017-02-05 17:30:00
【问题描述】:

我遇到了一个问题,即 SSE 事件等到脚本完成执行后才最终发送数据,经过数小时搜索合理的解释或解决方案后,我一无所获。

我找到了一个可以在该网站上运行的示例,但是将该代码放到我的服务器上,它不起作用。 (网址:http://www.binarytides.com/monitor-progress-long-running-php-scripts-html5-server-sent-events/

在这个例子中,我注意到Transfer-Encoding: chunked 的标头当我试图让 Apache 使用Header set 通过 .htaccess 发送此标头时,响应代码变成了“(失败)”。

我还注意到该示例没有Content-Length,而我的服务器中的那个。

这一切都在 Chrome v.53.0.2785.116m 上测试过

在那之后,我决定把它带到堆栈。

这是一个例子:

<?php
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');

    function sendMsg($id, $msg) {
        echo "id: $id" . PHP_EOL;
        echo "data: $msg" . PHP_EOL;
        echo PHP_EOL;
        ob_flush();
        flush();
    }

    while ($x < 5) {
        $serverTime = time();
        sendMsg($serverTime, 'server time: ' . date("h:i:s", time()));
        sleep(1);
        $x++;
    }
?>

如果我要对此脚本执行请求,我会得到这些标头:

HTTP/1.1 200 正常 日期:2016 年 9 月 27 日星期二 22:34:11 GMT 服务器:阿帕奇 缓存控制:无缓存 变化:接受编码,用户代理 内容编码:gzip 内容长度:91 保活:超时=15,最大值=43 连接:保持活动 内容类型:文本/事件流

在脚本完成执行之前,我不会从中获取任何数据。

在这一点上,我不清楚它的 Apache 或 PHP 是否有问题,但据我所知,服务器有问题。 我尝试过 5.5-7 的 PHP 版本,但都没有运气。

关于这里出了什么问题以及如何解决它的任何想法?

编辑 1: 我在另一台服务器上尝试了相同的脚本,它运行正常,并发送了以下标头:

HTTP/1.1 200 正常 服务器:nginx 日期:格林威治标准时间 2016 年 9 月 28 日星期三 15:40:00 内容类型:文本/事件流;charset=UTF-8 传输编码:分块 连接:保持活动 保活:超时=15 缓存控制:无缓存 ngpass_ngall: 1

【问题讨论】:

  • 你可以试试 curl,看看它的表现如何?这是在本地主机上运行吗?中间有代理的机会吗? ...但是,一切看起来都很好。刷新前的 ob_flush 是正确的。输出是“gzip”这一事实在我脑海中挥之不去,但我需要做一些检查,然后才能发布答案告诉你就是这样。
  • @DarrenCook 现在我很迷茫......当我卷曲 URL 时,它工作正常,但是当我再次尝试使用 EventSource 时,什么也没有。它不在本地主机上,而是在 WebServer 上。

标签: javascript php apache .htaccess server-sent-events


【解决方案1】:

我怀疑问题是对输出进行 gzip 压缩。 (您的工作 nginx 服务器没有这样做。)

在您的 .htaccess 文件中,您可以尝试这两种方法吗:

php_flag zlib.output_compression off
SetEnv no-gzip 1

(借自https://webmasters.stackexchange.com/q/61258/18151 及其答案。)

顺便说一句,您不需要自己添加分块标头;如果输出被分块,它将被设置。

【讨论】:

  • 谢谢!这解决了我的问题!我不能使用 'php_flag zlib.output_compression off' 但是我使用了 'SetEnv no-gzip 1' 它解决了我的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
相关资源
最近更新 更多