Javascript-为什么服务器发送的事件每3秒启动一次?
作者:互联网
这个问题已经在这里有了答案: > Setting time interval in HTML5 server sent events 3个
我是服务器发送事件的新手,因此我正在WAMP Server上尝试this W3Schools example.我拥有的文件是:
demo_sse.php
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$time = date('r');
echo "data: The server time is: {$time}\n\n";
flush();
?>
index.php
<!DOCTYPE html>
<html>
<body>
<h1>Getting server updates</h1>
<div id="result"></div>
<script>
if(typeof(EventSource) !== "undefined") {
var source = new EventSource("demo_sse.php");
source.onmessage = function(event) {
document.getElementById("result").innerHTML += event.data + "<br>";
};
} else {
document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";
}
</script>
</body>
</html>
据我了解,时间在不断变化,因此更新必须至少每秒发送一次.但是,每三秒钟接收一次更新.在demo_sse.php中未指定此间隔,因此:
>为什么每3秒发送一次更新?
>如何更改此间隔?
解决方法:
W3Schools上的示例有点不好.
对于大多数HTTP响应/请求交换,客户端向服务器发出HTTP请求,服务器发送回数据并且交换完成.
对于SSE(尽管它仍然使用HTTP协议),这有点不同.客户端在这里向服务器发出请求,会话保持打开状态,服务器可以在需要时发送数据.如果由于某种原因关闭了会话,EventSource将尝试重新连接,然后一切重新开始.
PHP脚本中的问题是该脚本在完成最后一行后结束了请求/响应交换.这意味着连接已关闭,因此EventSource将尝试重新连接. (添加.onerror
事件将显示在每条消息之后引发错误.)
如the specification中所定义:
A reconnection time, in milliseconds. This must initially be a user-agent-defined value, probably in the region of a few seconds.
这就是为什么您每三秒钟收到一次更新的原因.因为那是设置用户代理定义的值.
在该行下方,您还可以看到:
Apart from url these are not currently exposed on the EventSource object.
这意味着当前无法从JavaScript设置此值.
不过,可以通过在SSE消息的重试字段中定义此值来从服务器设置此值.您可以在此处以毫秒为单位定义用户代理在重新连接到服务器之前应等待多长时间.如果要将其设置为一秒,则应为:
$time = date('r');
// If the connection closes, retry in 1 second
echo "retry: 1000\n";
echo "data: The server time is: {$time}\n\n";
flush();
但是当然最好在不关闭第一个消息后关闭连接的情况下正确实施SSE.
A good explanation can be found on MDN.我建议一般在W3School上使用MDN. W3Schools is not the most liked resource here on Stack Overflow,这是一个很好的例子.
标签:server-sent-events,javascript,php 来源: https://codeday.me/bug/20191108/2007299.html