首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果我没有时间戳,AJAX长轮询的最佳实践

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

Stack Overflow用户
提问于 2021-03-21 13:35:34
回答 1查看 42关注 0票数 1

我有一个页面,使用AJAX来显示或隐藏由管理员在我的后端设置的消息。因此,我使用AJAX查看是否应该显示该消息。在我拥有的那一页上

代码语言:javascript
复制
$(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中

代码语言:javascript
复制
$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中加入一个循环。

代码语言:javascript
复制
while($output['messageText'] == NULL) {
    sleep(10);
    $output = getmessage($stmt);
}

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

EN

回答 1

Stack Overflow用户

发布于 2021-03-21 15:03:00

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

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

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

锁定语法:

阅读后:

代码语言:javascript
复制
LOCK TABLES messages WRITE;

更新后:

代码语言:javascript
复制
UNLOCK TABLES;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66729171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档