事件源(EventSource):始终收到错误

6
为了使用EventSource API,我写了一个最学术的例子。问题是我总是遇到错误,而且找不到任何有用的信息。当我加载home.html时,JS脚本在source.onerror处停止运行; 我将其打印到控制台中,但分析该对象时,我无法找到任何错误类型或消息,因此我不知道出了什么问题。这段代码中是否有错误?可能与服务器相关的错误吗?
<body>
  <div id="result"></div>
  <script src="sse.js"></script>
</body>

sse.js

function isSseEnabled() {
    return (typeof EventSource !== "undefined");
}

if (isSseEnabled()) {
    var source = new EventSource('source.php');
    source.onerror = function(e) {
        console.log(e);
        source.close();
    };
    source.onmessage = function (e) {
        console.log(e.data);
        document.getElementById('result').innerHTML += e.data.concat('<br>');
    }
} else {
    throw 'SSE not enabled';
}

source.php

<?php
header('Content-Type: text/event-stream');
header('Cache-control: no-cache');

$time = date('r');
echo "Time: $time";
flush();
1个回答

1

(简而言之:您没有使用SSE协议-请参见本答案的后半部分。)

首先,您需要获得适当的错误消息,或者至少查看您的脚本正在生成什么。我建议使用curl测试您的脚本。从命令行:

curl http://127.0.0.1/source.php

我假设你的html和source.php都在本地机器上,并且不使用https;如果不是,请进行调整。还要添加到source.php的路径。

如果这样可以,或者你没有可用的curl,请查看浏览器中的开发人员工具。查看与source.php的连接发生了什么,发送了什么,接收了什么。

然而,有几种方法可以改进PHP脚本。首先,在每个消息之前加上"data:"前缀,并在每个消息后添加几个LF;这是SSE协议所需的。

其次,使用一个带有休眠的无限循环(永远没有一个返回一件事并关闭的SSE脚本的点 - 在那种情况下,您可能会想使用AJAX)。因此,它将如下所示:

<?php
header('Content-Type: text/event-stream');
header('Cache-control: no-cache');

while(true){
    $time = date('r');
    echo "data:Time: $time\n\n";
    @ob_flush();flush();
    sleep(1);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接