我遇到了SSE事件等到脚本完成执行后才终于发送数据的问题,经过几小时寻找似是而非的解释或解决方案后,我什么也没找到。在脚本执行完成之前,SSE不发送事件?
我发现了一个例子,但在该网站上工作,但将该代码到我的服务器上,它不起作用。 (网址:http://www.binarytides.com/monitor-progress-long-running-php-scripts-html5-server-sent-events/)
在这个例子中,我已经注意到Transfer-Encoding: chunked
头当我曾试图让Apache通过的.htaccess发送这个头与Header set
,响应代码转向“(失败)”。
我也注意到这个例子没有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 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
你可以尝试卷曲,看看它的行为?这是在localhost上运行的;代理处于中间的任何机会? ...但是,一切看起来都不错。在刷新之前ob_flush是正确的。输出为“gzip”的事实在我的脑海中萦绕,但我需要做一些检查,然后再发布答案,告诉你是这样的。 –
@DarrenCook现在我很迷茫...当我蜷缩URL时,它工作正常,但是当我试图再次使用EventSource时,什么也没有。它不在本地主机上,它位于WebServer上。 – user5294195