我正在尝试掌握服务器端事件,因为它们完全符合我的要求并且看起来应该很容易实现,但是我无法克服一个模糊的错误,并且看起来连接反复被关闭并重新-打开。我所尝试的一切都是基于这个和其他教程。
PHP 是一个单一的脚本:
<?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();
}
$serverTime = time();
sendMsg($serverTime, 'server time: ' . date("h:i:s", time()));
?>
和 JavaScript 看起来像这样(在身体负载上运行):
function init() {
var source;
if (!!window.EventSource) {
source = new EventSource('events.php');
source.addEventListener('message', function(e) {
document.getElementById('output').innerHTML += e.data + '<br />';
}, false);
source.addEventListener('open', function(e) {
document.getElementById('output').innerHTML += 'connection opened<br />';
}, false);
source.addEventListener('error', function(e) {
document.getElementById('output').innerHTML += 'error<br />';
}, false);
}
else {
alert("Browser doesn't support Server-Sent Events");
}
}
我已经搜索了一下,但找不到关于
- 如果 Apache 需要任何特殊配置来支持服务器发送的事件,以及
- 我如何通过这种设置从服务器发起推送(例如,我可以简单地从 CLI 执行 PHP 脚本来推送到已经连接的浏览器吗?)
如果我在 Chrome (16.0.912.77) 中运行这个 JS,它会打开连接,接收时间,然后出错(错误对象中没有有用的信息),然后在 3 秒内重新连接并执行相同的过程。在 Firefox (10.0) 中,我得到了相同的行为。
编辑 1:我认为这个问题可能与我使用的服务器有关,所以我在 vanilla XAMPP 安装上进行了测试,并且出现了同样的错误。一个基本的服务器配置是否应该能够在不修改/额外配置的情况下处理这个问题?
编辑 2:以下是浏览器输出的示例:
connection opened
server time: 01:47:20
error
connection opened
server time: 01:47:23
error
connection opened
server time: 01:47:26
error
谁能告诉我这是哪里出错了?我看过的教程使 SSE 看起来非常简单。此外,对我上面的两个编号问题的任何答案都会非常有帮助。
谢谢。