【发布时间】:2014-04-16 17:28:45
【问题描述】:
我正在尝试制作传入消息的通知系统。例如,用户停留在页面上,他在一个块中收到他有 2 条未读消息。
我的客户代码:
(function getmess(){
var id = '<?=$MY_ID;?>';
$.ajax({
url:"notif.php",
data:{"id":id,},
type:"GET",
success: function(result){
$("#count").html(result);
}, dataType: "json",
complete: getmess,
timeout: 10000});
})();
我的服务器代码:
<?php
$mysqli = new mysqli('localhost', 'root', '', 'lc');
if (mysqli_connect_errno()) {
printf("error: %s\n", mysqli_connect_error());
exit;
}
$MY_ID = $_POST['id'];
while (true) {
$result = $mysqli->query("SELECT COUNT(*) FROM messages WHERE user_get='$MY_ID' AND status='0' ");
if (mysqli_num_rows($result)) {
while ($row = mysqli_fetch_array($result)) {
echo $row[0]."";
}
exit;
}
sleep(5);
}
一切正常,但我遇到的问题是 ajax 请求每 1 秒发送一次,这些请求的长度为 1 秒,它们会使服务器过载。
我想等待服务器响应至少10秒,在响应成功的情况下立即发送新请求,以及如果服务器在10秒内没有响应,即在数据库中有没有变化,然后发送一个 10 秒的新查询长度。
我认为服务器有问题(可能是服务器循环),但我不知道如何改进。
【问题讨论】:
-
我建议改用 websockets。
-
您的客户端代码有问题,而不是服务器。你必须用
setTimeout包裹getmess电话。
标签: php ajax long-polling