Javascript 在脚本完成执行之前,SSE是否不发送事件?
我遇到了一个问题,即SSE事件要等到脚本完成执行后才能最终发送数据,在搜索了几个小时的合理解释或解决方案后,我什么也没找到 我已经找到了一个在那个网站上运行的例子,但是把代码放到我的服务器上,它就不工作了。(网址:) 在本例中,我注意到一个标题为Javascript 在脚本完成执行之前,SSE是否不发送事件?,javascript,php,apache,.htaccess,server-sent-events,Javascript,Php,Apache,.htaccess,Server Sent Events,我遇到了一个问题,即SSE事件要等到脚本完成执行后才能最终发送数据,在搜索了几个小时的合理解释或解决方案后,我什么也没找到 我已经找到了一个在那个网站上运行的例子,但是把代码放到我的服务器上,它就不工作了。(网址:) 在本例中,我注意到一个标题为传输编码:chunked,当我试图让Apache使用标题集通过.htaccess发送此标题时,响应代码变为“(失败)” 我还注意到这个示例没有内容长度,而我的服务器上的示例没有 这一切都是在铬v.53.0.2785.116m上测试的 在那之后,我决定把它
传输编码:chunked
,当我试图让Apache使用标题集通过.htaccess发送此标题时,响应代码变为“(失败)”
我还注意到这个示例没有内容长度
,而我的服务器上的示例没有
这一切都是在铬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
HTTP/1.1200ok
日期:2016年9月27日星期二22:34:11 GMT
服务器:Apache
缓存控制:没有缓存
更改:接受编码,用户代理
内容编码:gzip
内容长度:91
保持活动状态:超时=15,最大=43
连接:保持活力
内容类型:文本/事件流
在脚本完成执行之前,我不会从中获取任何数据
在这一点上,我不清楚它的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
HTTP/1.1200ok
服务器:nginx
日期:2016年9月28日星期三15:40:00 GMT
内容类型:文本/事件流;字符集=UTF-8
传输编码:分块
连接:保持活力
保持活动状态:超时=15
缓存控制:没有缓存
ngpass_ngall:1
我怀疑问题在于gzip压缩了输出。(您正在工作的nginx服务器没有这样做。)
在.htaccess文件中,是否可以尝试以下两种方法:
php_flag zlib.output_compression off
SetEnv no-gzip 1
(借用自及其答案。)
顺便说一句,您不需要自己添加分块标题;如果输出是分块的,它将被设置。您可以试试curl,看看它是如何工作的吗?这是否在本地主机上运行;代理的机会是否在中间?但是,一切看起来都很好。冲洗前的ob_冲洗是正确的。输出为“gzip”的事实一直困扰着我,但我需要做一些检查,然后才能发布一个答案告诉你是它。@DarrenCook现在我非常迷茫。。。当我卷曲URL时,效果很好,但当我再次尝试使用EventSource时,什么都没有。它不在本地主机上,而是在Web服务器上。谢谢!这解决了我的问题!我不能使用'php_flag zlib.output_compression off',但是我使用了'SetEnv no gzip 1',它解决了我的问题!