Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在脚本完成执行之前,SSE是否不发送事件?_Javascript_Php_Apache_.htaccess_Server Sent Events - Fatal编程技术网

Javascript 在脚本完成执行之前,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上测试的 在那之后,我决定把它

我遇到了一个问题,即SSE事件要等到脚本完成执行后才能最终发送数据,在搜索了几个小时的合理解释或解决方案后,我什么也没找到

我已经找到了一个在那个网站上运行的例子,但是把代码放到我的服务器上,它就不工作了。(网址:)

在本例中,我注意到一个标题为
传输编码: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',它解决了我的问题!