如果我没有时间戳,AJAX长轮询的最佳实践



我有一个页面,它使用AJAX在后台显示或隐藏管理员设置的消息。所以我使用AJAX来查看是否应该显示该消息。在页面上我有

$(document).ready(function() {
getmessage();
});
function getData() {    
$.ajax({ 
type: "GET",
url: "./ajax/getMessage.php",                           
success: function(response){ 
if (response != "") {
// show message
} else {
// hide message
}
setTimeout(
getData,
15000
);
}
});
};

在我的getMessage.php

$stmt = $db->prepare("SELECT * FROM messages WHERE display = 1");
$output = getmessage($stmt);
echo $output ['messageText'];
function getmessage($stmt) {
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
return $row;
}

这很好,但由于它是一个活动网站,我的页面上最多可以有2000名用户,每15秒轮询一次可能不是最好的主意(尤其是因为我在同一页面上也有一个跟踪脚本,它每几分钟发送一次AJAX帖子(。但是,当显示状态发生变化或选择了另一条消息时,我如何将其切换为长轮询以获得更新?我试着在我的php 中放入一个循环

while($output['messageText'] == NULL) {
sleep(10);
$output = getmessage($stmt);
}

但这会冻结我的服务器,并且在消息更改或显示从1设置为0时不会给我任何数据。不知怎么的,我被卡住了。

您可以考虑使用SSE。这基本上类似于长轮询,但使用相同的php代码也可以创建长轮询。

关于数据库,您应该为表建立一个锁,这将使它只有在解除锁后才能访问,解除锁后,查询将返回,php脚本将传递消息\事件。https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html

读取后,您可以重新定位表。

锁定语法:

读取后:

LOCK TABLES messages WRITE;

更新后:

UNLOCK TABLES;

最新更新