SSE在脚本执行完之前不发送事件?

时间:2016-09-27 22:55:02

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

我遇到的问题是SSE事件一直等到脚本完成执行才终于发送数据,经过数小时搜索合理的解释或解决方案后,我什么也没找到。

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

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

我也注意到这个例子没有Content-Length,就像我服务器那样。{/ p>

这一切都在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 OK
Date: Tue, 27 Sep 2016 22:34:11 GMT
Server: Apache
Cache-Control: no-cache
Vary: Accept-Encoding,User-Agent
Content-Encoding: gzip
Content-Length: 91
Keep-Alive: timeout=15, max=43
Connection: Keep-Alive
Content-Type: text/event-stream

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

此时我不清楚它的Apache或PHP是否有问题,但是从我能告诉服务器的错误。 我已经尝试过从5.5-7开始的PHP版本,但都没有运气。

关于这里出错的任何想法以及如何解决它?

编辑1: 我在另一台服务器上尝试了相同的脚本并且它已正常工作,并发送了以下标题:

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 28 Sep 2016 15:40:00 GMT
Content-Type: text/event-stream;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=15
Cache-Control: no-cache
ngpass_ngall: 1

1 个答案:

答案 0 :(得分:1)

我怀疑问题是gzip输出。 (你工作的nginx服务器没有这样做。)

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

php_flag zlib.output_compression off
SetEnv no-gzip 1

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

顺便说一句,你不应该自己添加分块头;如果输出被分块,它将被设置。