我有一个页面,使用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时,不会为我提供任何数据。不知何故我被卡住了。
发布于 2021-03-21 15:03:00
您可以考虑使用SSE。这基本上类似于长轮询,但使用相同的php代码也可以创建长轮询。
关于数据库,您应该为表创建一个事件,这将使其仅在锁定解除后才可访问,在解除锁定后,查询将返回,并且php脚本将传递消息\ lock。https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html
读取后-您可以重新锁定表。
锁定语法:
阅读后:
LOCK TABLES messages WRITE;更新后:
UNLOCK TABLES;https://stackoverflow.com/questions/66729171
复制相似问题