Javascript 如果我没有时间戳,AJAX长轮询的最佳实践
我有一个页面,它使用AJAX在我的后端显示或隐藏管理员设置的消息。因此,我使用AJAX查看是否应该显示该消息。在我的网页上Javascript 如果我没有时间戳,AJAX长轮询的最佳实践,javascript,php,jquery,ajax,Javascript,Php,Jquery,Ajax,我有一个页面,它使用AJAX在我的后端显示或隐藏管理员设置的消息。因此,我使用AJAX查看是否应该显示该消息。在我的网页上 $(document).ready(function() { getmessage(); }); function getData() { $.ajax({ type: "GET", url: "./ajax/getMessage.
$(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时,不会给我任何数据。不知怎的,我被卡住了。 你可以考虑使用。
这基本上类似于长轮询,但使用相同的php代码也可以创建长轮询
关于数据库,您应该为表创建一个函数,这将使它只有在解除锁定后才可访问,解除锁定后,查询将返回,php脚本将传递消息\事件
读取后,您可以重新锁定表格
锁定语法:
阅读后:
LOCK TABLES messages WRITE;
更新后:
UNLOCK TABLES;
实时消息应该由websocket处理@AnuratChapanond或者,如果他没有websocket服务器,他可以使用ajax轮询…在事件发生时,该页面在客户端服务器上使用。大部分是低预算共享主机。不幸的是,除了php和mysql之外,我无法控制任何服务器技术。这是一种非常有趣的方法。我不认为我可以使用Lock,因为消息是用户生成的,所以其他脚本从这个表中读写了很多。但我会研究一下SSE。@Torf您仍然需要php代码中的某种“触发器”来知道消息何时出现,即使在使用SSE时,我也使用过一次文件查看器,每次用户上传消息时,我都会在特定位置创建一个文件,其中包含消息所需的数据,通过这种方式,我可以通知所有用户新消息,php代码将被阻止,直到文件被创建\编辑。