2016-09-27 48 views
1

我遇到了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 
+0

你可以尝试卷曲,看看它的行为?这是在localhost上运行的;代理处于中间的任何机会? ...但是,一切看起来都不错。在刷新之前ob_flush是正确的。输出为“gzip”的事实在我的脑海中萦绕,但我需要做一些检查,然后再发布答案,告诉你是这样的。 –

+0

@DarrenCook现在我很迷茫...当我蜷缩URL时,它工作正常,但是当我试图再次使用EventSource时,什么也没有。它不在本地主机上,它位于WebServer上。 – user5294195

回答

1

我怀疑问题是用gzip荷兰国际集团输出。 (你的工作nginx的服务器没有这样做。)

在你的.htaccess文件,你可以尝试这两种:

php_flag zlib.output_compression off 
SetEnv no-gzip 1 

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

BTW,你不需要自己添加分块头;如果输出被分块,它将被设置。

+1

谢谢!这解决了我的问题!我无法使用'php_flag zlib.output_compression',但是我使用'SetEnv no-gzip 1',它解决了我的问题! – user5294195

相关问题