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

时间:2013-09-07 22:59:03

标签: php javascript server-sent-events

我是一名学生,我正在为一个社交交易平台做一个项目。我想实现一个通知系统,我认为SSE是一个好主意。但是,我的SSE代码由于某种原因重复发送数据(我只想发送一次)。我在localhost上的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()));
?>

客户端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>

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

1 个答案:

答案 0 :(得分:1)

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

  

服务器发送事件(SSE)是HTML5规范的一部分。 SSE允许客户端和服务器之间的单向持久连接,这样客户端只发出一个请求,服务器不断地持续向客户端推送数据,直到连接关闭。

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

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

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

但是,既然你想建立一个交易系统,我认为SSE不是一个好主意。从我的角度来看,SSE适用于大规模传播的消息,而不是向特定客户端发送消息。我推荐网络套接字。

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