Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果我没有时间戳,AJAX长轮询的最佳实践_Javascript_Php_Jquery_Ajax - Fatal编程技术网

Javascript 如果我没有时间戳,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.

我有一个页面,它使用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时,不会给我任何数据。不知怎的,我被卡住了。

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

关于数据库,您应该为表创建一个函数,这将使它只有在解除锁定后才可访问,解除锁定后,查询将返回,php脚本将传递消息\事件

读取后,您可以重新锁定表格

锁定语法:

阅读后:

LOCK TABLES messages WRITE;
更新后:

UNLOCK TABLES;

实时消息应该由websocket处理@AnuratChapanond或者,如果他没有websocket服务器,他可以使用ajax轮询…在事件发生时,该页面在客户端服务器上使用。大部分是低预算共享主机。不幸的是,除了php和mysql之外,我无法控制任何服务器技术。这是一种非常有趣的方法。我不认为我可以使用Lock,因为消息是用户生成的,所以其他脚本从这个表中读写了很多。但我会研究一下SSE。@Torf您仍然需要php代码中的某种“触发器”来知道消息何时出现,即使在使用SSE时,我也使用过一次文件查看器,每次用户上传消息时,我都会在特定位置创建一个文件,其中包含消息所需的数据,通过这种方式,我可以通知所有用户新消息,php代码将被阻止,直到文件被创建\编辑。