服务器发送事件 - text/event-stream 有时会被 chrome 和 firefox 误解为 text/html

问题描述 投票:0回答:3

我构建了一个应用程序,在某些时候,使用服务器发送事件(从长时间运行的 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');

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

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

所有PC上的浏览器版本完全相同(分别为39.0和43.0.2357.134m)。我姐姐的笔记本电脑运行 Windows 7 Home Premium SP1。

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

php google-chrome firefox server-sent-events event-stream
3个回答
2
投票

事件流是必须编码的简单文本数据流 使用

UTF-8

来源:MDN

这应该适用于 Chrome 和 Firefox。

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

0
投票
header('Cache-Control: no-cache');  
header('Content-Type: text/event-stream; charset=utf-8');
$id=111;
$arr=[333,444,555];
echo "id: $id" . PHP_EOL;
echo "data: ".json_encode($arr).PHP_EOL;
echo 'retry: 2000', PHP_EOL, PHP_EOL; //2000 is miliseconds

-1
投票

这两行的相反顺序:

flush(); 

ob_flush();
© www.soinside.com 2019 - 2024. All rights reserved.