使用Server-Sent事件广播消息

kba*_*tis 6 php sockets html5 broadcast server-sent-events

我想实现一个简单的Server-Sent事件应用程序,客户端监听这样的php文件

<script src="eventsource.js"></script>
<script>
  var es = new EventSource('../sse.php');

  es.onmessage = function (event) {
    var data = JSON.parse(event.data);
    console.log('msg: ' + event.data);
  };

  es.onopen = function () {
    console.log('connected');
  }
</script>
Run Code Online (Sandbox Code Playgroud)

但后来我需要能够广播一条消息,每个连接的客户端同时获取它.

php文件将被另一个请求触发,它会将一些SSE数据"回显"给所有客户端.

这可能吗?我可以采取另一条路线吗?

先感谢您

Jef*_*ffS 7

PHP对此并不是很好.如果有很多客户端正在等待此事件,那么您将需要为每个等待的客户端提供PHP解释器的实例(可能还有一个apache线程).

您可能会考虑做的是让事件驱动的服务器处理这个问题.Node.JS和Tornado(Python)是我过去在类似情况下使用过的两个环境.如果您使用Node.js,您可能需要查看socket.io - 它不使用Server Sent Events,但会使您想要的非常简单.

你可以并排两个网络服务器,你当前的服务器(我假设是Apache)和你写的一个处理等待更新的客户端.每当PHP服务器想要向等待的客户端发送消息时,PHP服务器通知另一个服务器(AMQP,ZeroMQ,redis Pub/Sub或非公共接口上的简单HTTP请求都是不错的选择),并且该服务器将消息传递给任何等待的客户端.

你可以在github上看到一个非常简单的版本,我正在谈论使用node.js + socket.io(可以很容易地被SSE取代).