【问题标题】:Server Sent Events - Event-Stream - Trigger a PHP server side event?服务器发送事件 - 事件流 - 触发 PHP 服务器端事件?
【发布时间】:2013-05-11 19:52:09
【问题描述】:

我有一个使用 HTML、CSS、jQuery 的聊天面板。设置一个没有问题的事件监听器。设置一个文本/事件流 php 文件,它可以毫无问题地向客户端发送消息。如何从客户端与此服务器脚本进行通信,以便在收到来自任何一个客户端的新消息后,它将向所有打开事件流的用户广播消息?服务器应仅在收到新消息时发送事件。

这里是 message_sender.php:

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

while (1) {
 if ($newMessage){ //How does $newMessage get filled in an already running script?
  echo "id: 1234\n";
  echo "event: ping\n";
  echo 'data: {"newMessage": "' . $newMessage . '"}';
  echo "\n\n";
 }

 ob_flush();
 flush();
 sleep(1);
}

这里是js:

var evtSource = new EventSource("message_sender.php");

evtSource.onmessage = function(e) {
}

evtSource.addEventListener("ping", function(e) {
 var newElement = document.createElement("li");       
 var obj = JSON.parse(e.data);
 newElement.innerHTML = "ping " + obj.newMessage;
 $('#chat_panel').append(newElement);
}, false);

evtSource.onerror = function(e) {
    alert("EventSource failed.");
};

$('#message_form').submit(function(e){
 e.preventDefault();
 var message = $('#txtb_chat').val();

 $.ajax({
  type: 'POST',
  dataType: 'json',
  data: message,
  url: 'message_processor.php',
  beforeSend: function(){

  },
  success: function(){
   $('#txtb_chat').val("");
  }
 });
 return false;
});

【问题讨论】:

    标签: javascript php server-sent-events event-stream


    【解决方案1】:

    您可以使用 AJAX 向服务器发送新消息并将消息存储在数据库中。

    您可以通过查询共享数据库来填写$newMessage

    您可以使用id:Last-Event-Id 来跟踪客户端看到的消息并查询SELECT * FROM chat WHERE id > $last_event_id

    【讨论】:

    • 感谢您的回复。我希望有一种方法可以在内存中处理这个问题,而不是使用 mysql db。我想可能没有比 db 更好的方法了。
    • @carter 您可以使用 Redis 等内存数据库。