SetInterval($。获得30秒的游泳池

时间:2015-05-29 05:56:51

标签: javascript php pool

为了避免在我的服务器上发出多个请求,我正在尝试实现一个池:所以我每30秒发出一次请求,如果发现它就会发送一次数据,或者30秒过去了。

//getchat.php

$pool=0;
$chatmsg= array();

while($pool<30 && count($chatmsg)==0){

    $result = mysqli_query($con,"SELECT * FROM chat WHERE id > ".addslashes($_GET['id'])." ORDER BY id ASC");
    $i=0;
    while($row = mysqli_fetch_assoc($result)) {
        $chatmsg[$i]=array("message"=>htmlspecialchars_decode(htmlentities($row["message"])));
        $i++;
    }

    sleep(1);
    $pool++;
}

echo json_encode($chatmsg);
flush();
//script.js

setInterval(function() {
    $.get("getchat.php", {
        id: chatid
    }, function(data) {
        console.log(data);
    });

}, 30000);

但是这些消息显示在30秒之后!我究竟做错了什么?

编辑:我终于找到了:

&#13;
&#13;
function getchat(){ 
$.get("getchat.php", {
        id: chatid
    }, function(data) {
        console.log(data);
         getchat();
    });

}
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

30秒后显示消息,因为您有间隔。它只在30秒后被调用。如果你想立即调用它,你可以像这样更改代码:

//script.js

function getChat() {
    $.get("getchat.php", {
        id: chatid
    }, function(data) {
        console.log(data);
    });
}
getChat();
setInterval(getChat, 30000);

修改

我已经做了自己的测试来重现这种情况:

// index.php
while (!file_exists(__DIR__ . '/flag')) {
    sleep(1);
}

echo date('r');
flush();
die;


// index.html

<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript"> 

function getChat() {
     $.get(
         "index.php", 
         {}, 
         function(data) {
             console.log(data);
         }
     );
}
getChat();
setInterval(getChat, 10000);
</script>
</head>
<body>
</body>
</html>

每当我调用index.html时,我都可以在控制台中看到待处理的请求。在我创建文件“flag”后,它立即停止,我在console.log中得到一个日期。

我建议你做两件事:

  1. 重新检查待处理请求的控制台。他们应该在那里跑。

  2. 在不涉及数据库的情况下,在PHP代码中重新创建更简单的情况。