我有一个页面,它使用 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 时不会给我任何数据。不知何故我卡住了。
答案 0 :(得分:1)
您可以考虑使用 SSE。 这基本上就像长轮询,但使用相同的 php 代码你也可以创建长轮询。
关于数据库,你应该为表做一个lock,只有在锁解除后才能访问,解除后,查询将返回,php脚本将传递消息\事件. https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html
读取后 - 您可以重新锁定表。
锁定语法:
阅读后:
LOCK TABLES messages WRITE;
更新后:
UNLOCK TABLES;