Javascript 如何仅触发一次服务器发送的事件?

Javascript 如何仅触发一次服务器发送的事件?,javascript,php,server-sent-events,Javascript,Php,Server Sent Events,我当前正在服务器/网页上实现服务器发送的事件。我已经实现了一个简单的php脚本,它只回显“1”和简单的JavaScript,获取消息并将其显示在屏幕上。我不明白的是,为什么它不在php脚本中查看一段时间,却在网页上重复打印“1” 我读过多个论坛和文章,我似乎不明白为什么它会这样做 php代码是: <?php header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); $

我当前正在服务器/网页上实现服务器发送的事件。我已经实现了一个简单的php脚本,它只回显“1”和简单的JavaScript,获取消息并将其显示在屏幕上。我不明白的是,为什么它不在php脚本中查看一段时间,却在网页上重复打印“1”

我读过多个论坛和文章,我似乎不明白为什么它会这样做

php代码是:

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

    $num = 1;

    echo "data: {$num} \r\n";
    @ob_flush();
    flush();
    usleep(500000);

?>

Javascript是:

var source = new EventSource("sse.php");
source.onmessage = function(event) {
    document.getElementById("result").innerHTML += event.data + "<br>";
};
var source=neweventsource(“sse.php”);
source.onmessage=函数(事件){
document.getElementById(“结果”).innerHTML+=event.data+“
”; };

我希望php文件运行一次,数字“1”显示在屏幕上,但它似乎每隔几秒钟运行一次,在屏幕上重复打印1。这是为什么?

浏览器在连接关闭一段时间后尝试重新连接。您可以在服务器响应中使用
retry:X
设置延迟(毫秒)


顺便说一句,Microsoft浏览器不支持服务器发送的事件(到目前为止,Edge 18)

这种情况是因为浏览器反复重新连接到事件流,导致PHP再次运行。使用PHP打印当前服务器时间的示例,您会更好地看到它,因为每次调用服务器时,它都会打印不同的内容。该页面还讨论了阻止重复发送同一事件的技术,我想这有点像你要问的那样。如果浏览器每x秒重新连接一次服务器,这与轮询有什么不同?我可能误解了这里的概念,因为如果流没有结束,那么它就不需要重新连接。它打开一个连接,并可以接收连接生存期内发送的任何事件。如果服务器关闭了连接(您的脚本就是这样做的,因为它运行了一段时间然后停止了),浏览器将假定存在问题,然后继续重新打开连接,除非您告诉它不要这样做。因为当连接被重新打开时,PHP代码会从头开始,并且不会跟踪之前发送的内容,这就是为什么会看到repeatedP.s值。您可能需要考虑使用PHP库,例如这一个(不推荐,只是随机谷歌搜索的结果):它将在服务器上实现SSE事件流,使连接保持活跃,这里有一个简单的例子,展示了如何在不使用库的情况下编写自己的事件流。它通过确保脚本永不结束(使用无限循环,即
while(1)
),保持与PHP的连接打开: