为了避免在我的服务器上发出多个请求,我正在尝试实现一个池:所以我每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秒之后!我究竟做错了什么?
编辑:我终于找到了:
function getchat(){
$.get("getchat.php", {
id: chatid
}, function(data) {
console.log(data);
getchat();
});
}
&#13;
答案 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中得到一个日期。
我建议你做两件事:
重新检查待处理请求的控制台。他们应该在那里跑。
在不涉及数据库的情况下,在PHP代码中重新创建更简单的情况。