【发布时间】:2017-02-05 17:30:00
【问题描述】:
我遇到了一个问题,即 SSE 事件等到脚本完成执行后才最终发送数据,经过数小时搜索合理的解释或解决方案后,我一无所获。
我找到了一个可以在该网站上运行的示例,但是将该代码放到我的服务器上,它不起作用。 (网址:http://www.binarytides.com/monitor-progress-long-running-php-scripts-html5-server-sent-events/)
在这个例子中,我注意到Transfer-Encoding: chunked 的标头当我试图让 Apache 使用Header set 通过 .htaccess 发送此标头时,响应代码变成了“(失败)”。
我还注意到该示例没有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 正常 日期:2016 年 9 月 27 日星期二 22:34:11 GMT 服务器:阿帕奇 缓存控制:无缓存 变化:接受编码,用户代理 内容编码:gzip 内容长度:91 保活:超时=15,最大值=43 连接:保持活动 内容类型:文本/事件流在脚本完成执行之前,我不会从中获取任何数据。
在这一点上,我不清楚它的 Apache 或 PHP 是否有问题,但据我所知,服务器有问题。 我尝试过 5.5-7 的 PHP 版本,但都没有运气。
关于这里出了什么问题以及如何解决它的任何想法?
编辑 1: 我在另一台服务器上尝试了相同的脚本,它运行正常,并发送了以下标头:
HTTP/1.1 200 正常 服务器:nginx 日期:格林威治标准时间 2016 年 9 月 28 日星期三 15:40:00 内容类型:文本/事件流;charset=UTF-8 传输编码:分块 连接:保持活动 保活:超时=15 缓存控制:无缓存 ngpass_ngall: 1【问题讨论】:
-
你可以试试 curl,看看它的表现如何?这是在本地主机上运行吗?中间有代理的机会吗? ...但是,一切看起来都很好。刷新前的 ob_flush 是正确的。输出是“gzip”这一事实在我脑海中挥之不去,但我需要做一些检查,然后才能发布答案告诉你就是这样。
-
@DarrenCook 现在我很迷茫......当我卷曲 URL 时,它工作正常,但是当我再次尝试使用 EventSource 时,什么也没有。它不在本地主机上,而是在 WebServer 上。
标签: javascript php apache .htaccess server-sent-events