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

时间:2021-03-21 05:35:33

标签: javascript php jquery 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 时不会给我任何数据。不知何故我卡住了。

1 个答案:

答案 0 :(得分:1)

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

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

读取后 - 您可以重新锁定表。

锁定语法:

阅读后:

LOCK TABLES messages WRITE;

更新后:

UNLOCK TABLES;
相关问题