服务器发送事件会重复发送数据

3

我是一名学生,正在为一个社交交易平台做项目。我想实现一个通知系统,我认为SSE是个好主意。然而,我的SSE代码由于某种原因会重复发送数据(我只想发送一次)。我在本地主机的XAMMP APACHE上运行这些脚本。

SSE sse.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()));
?>

Client financials.php

<!DOCTYPE html>
<html>
<body>
<h1>Getting server updates</h1>
<div id="result"></div>

<script>
if(typeof(EventSource)!=="undefined")
  {
  var source=new EventSource("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>

感谢您提前提供的任何帮助:)

将鼠标悬停在 server-sent-events 标签上。 - Lawrence Cherone
似乎服务器只是发送一条消息,然后像普通的非SSE请求一样关闭连接。当服务器关闭SSE连接时,客户端会重新连接,就像它应该做的那样。所以这对你来说看起来像是服务器在重复发送信息,因为它确实是这样做的。通常,SSE服务器是不会关闭连接的。它会等待数据可用,然后通过您的sendMsg()函数循环发送信息。尝试将对sendMsg()的调用放入一个带有每次迭代中的sleep(3)的循环中。这应该是一个很好的开始。 - Matt
1个回答

1
SSE旨在重复发送消息(例如,除非您调用close方法,否则连接将始终保持打开状态)。

服务器发送事件(SSE)是HTML5规范的一部分。 SSE允许客户端与服务器之间建立单向持久连接,使得客户端仅发出一次请求,服务器不断向客户端推送数据,直到连接关闭。

可以通过retry字段设置频率。有关详细信息,请查看此处

在我的一个以前的项目中,我利用id字段唯一标识事件。当客户端接收到事件时,检查是否已处理该事件。如果没有,则处理它。否则,忽略它。您可以通过以下方式设置字段:

echo "retry: xx"
echo "id: xx"

然而,由于你想要创建一个交易系统,我认为SSE并不是一个好的选择。从我的角度来看,SSE适用于大规模传播消息,而不是向特定客户端发送消息。我建议使用WebSocket。

顺便说一下:永远不要忘记尾随的'\n'...


PHP_EOL 是根据操作系统的不同,\r\n 的组合形式。 - Daniel W.

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