我遇到的问题是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
答案 0 :(得分:1)
我怀疑问题是gzip输出。 (你工作的nginx服务器没有这样做。)
在.htaccess文件中,您可以尝试以下两种方法:
php_flag zlib.output_compression off
SetEnv no-gzip 1
顺便说一句,你不应该自己添加分块头;如果输出被分块,它将被设置。