【发布时间】:2017-12-13 18:46:50
【问题描述】:
我的网站上运行了一个小的额外聊天室服务,我正在使用 SSE 不断向客户发送聊天更新,但是,由于断开连接和自动重新连接,事件源的消息似乎不断触发,或者至少是这样我在网上浏览了几个小时后才发现。
这是我的 PHP
header("Content-Type: text/event-stream");
header('Cache-Control: no-cache');
$matchid = $_GET["curMatch"];
$root = $_SERVER['DOCUMENT_ROOT'];
$filename = $root . "/pickup/chat/chatroom.txt";
$lastMod = NULL;
while(true){
if(connection_status() != CONNECTION_NORMAL) {
$conn->close();
break;
}
clearstatcache();
$checker = filemtime($filename);
if($checker != $lastMod){
$lastMod = $checker;
echo "data: 1\n\n";
ob_end_flush();
flush();
usleep(400);
}
}
这里是 jQuery
matchID = 1;
if(typeof(EventSource) !== "undefined") {
var chatSource = new EventSource("/pickup/php/check-chat-sse.php?curMatch="+matchID);
chatSource.onmessage = function(event) {
var dt = new Date();
var time = dt.getHours() + ":" + dt.getMinutes() + ":" + dt.getSeconds();
console.log("Chat Server responded: @" +time);
console.log(event.data);
$.ajax({
type: "POST",
url: "/pickup/chat/"+matchID+".txt",
datatype: 'text',
success: function (response) {
$("#chat-content").html(response);
}
});
if (hidden == true){
$("#chat-toggle").addClass("newMessage");
}
}
}
最后,控制台日志
聊天服务器回复:@20:36:54 聊天服务器回复:@20:37:24 聊天服务器回复:@20:38:52
这会导致每次服务器重新连接时都会添加 .newMessage 类,从而使用户在没有新消息时认为有新消息。我也在 SSE 上运行一个更复杂的系统,也遇到同样的问题,所以如果我能找到解决方案,一切都会更好。
那么我如何确保用户在不创建反向 AJAX 轮询的情况下不会断开连接并重新连接,因为这是大多数人的建议。任何建议或帮助将不胜感激。
【问题讨论】: