服务器发送的事件-文本/事件流偶尔会被chrome和firefox误解为文本/html


Server sent events - text/event-stream ocasionally misenterpreted as text/html by chrome and firefox

我已经构建了一个应用程序,在某些时候,使用服务器发送事件,从一个长时间运行的php脚本发送,更新前端的进度条。在我面对冲洗php脚本输出的典型问题并尝试了我在SO中读到的所有可能的解决方案之后,我得出结论,使其工作的唯一方法是通过回显一长串空格来强制输出。向浏览器发送消息的函数如下:

function sendMsg($id, $array) {
            echo "id: $id" . PHP_EOL;
            echo "data: ".json_encode($array).PHP_EOL;
            echo PHP_EOL;
            flush();
            ob_flush();
            echo str_repeat(' ', 4096);
}

脚本头如下:

header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

在我用的个人电脑上,一切似乎都运行得很好,但当我在我姐姐的笔记本电脑上测试这个应用程序时,我注意到Firefox和Chrome有这种奇怪的行为。在接收到前两条消息后,它们会断开连接。Firefox尝试重新连接时,Chrome抛出一个错误:

EventSource响应的MIME类型("text/html")不是"text/event-stream"

所有pc的浏览器版本完全相同(分别为39.0和43.0.2357.134m)。我姐姐的笔记本电脑用的是Windows 7家庭高级版SP1。

如何解释这种不同的行为?它是否取决于浏览器的设置,还是归因于一些系统范围的设置?我姐姐的笔记本电脑上的ie10没有出现这个问题。

事件流是必须编码的简单文本数据流using UTF-8 .

来源:MDN

这应该可以在Chrome和Firefox中工作。

header('Content-Type: text/event-stream; charset=utf-8');

两行倒序:

flush(); 

ob_flush();