我使用php和ajax聊天,我正在使用while循环来检查数据库中的新消息。
这是检索邮件的代码:
//retrive message
function update(){
$(document).ready(function(){
$.ajax({
async: true,
type: "POST",
url: "listen.php",
success: function(data){
$("#myp").before(data);
},
complete: function(){
window.setTimeout("update();",100);
}
});
});
};
//wating for new message
<?php
include_once("connect.php");
$type="";
while($type!=='n'){
usleep(1000);
$search=mysql_query("SELECT * from chat ORDER BY id DESC LIMIT 1");
$row=mysql_fetch_assoc($search);
$type=$row['type'];
$id=$row['id'];
}
echo $row['message'] . "<br/>";
mysql_query("UPDATE chat SET type='o' WHERE id=$id");
?>
现在这个工作正常,php文件不断检查是否有任何新消息,更新函数在页面加载时启动并等待响应。 但它有效吗?如果我会在网站上使用它,我担心它会对服务器造成太大压力,因为while循环。有没有人知道一种方式,使这个while循环更加服务器友好?
答案 0 :(得分:1)
你的预感是正确的。典型的服务器设置可以回答每秒100-1000个PHP请求之间的任何情况,因此每个客户端每秒执行10个请求会占用服务器上很多的资源。虽然它可能会为少数人创造,但它不会很好地扩展。您的服务器最多可能在10到100个用户之间(相当低)。
一个解决方法是增加每次服务器轮询之间的时间,但这只是一个线性修复,会降低用户的体验。
更好的解决方案可能是使用comet方法。纯粹使用PHP很难(如果不是不可能),所以你需要处理一些外部API来处理长的http请求。