我正在做一个聊天框,一切都很好,除了更新的东西。
我目前每3秒刷新一次页面,以检查任何新消息,但它肯定会在服务器上造成大量负载,并不优雅。
我想要的是,聊天框只在数据库更新时检查新消息,而不是每3秒检查一次数据库的计时器
最佳答案
您需要ajax推送(服务器只在有新内容时才向客户端发送更新)。请参见此处的示例:http://provatosys.com/bid.html
类似的事情会详细说明客户的请求:
function sendRequest(uid){
var xmlhttp;
var myUserId="";
myUserId=uid;
if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
} else { // code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
displayInChat(xmlhttp.responseText)//do stuff (process response, display message)
}
}
xmlhttp.open("GET","process_request.php?userid="+uid,true);
xmlhttp.send();
setTimeout("sendRequest("+uid+")",1000); //poll every second
}
现在,您希望延迟服务器(process_request.php)的回复,直到有要发送的内容(例如使用
while (($msg=new_msgs()) === false) {sleep(timeout);}
之类的内容)或请求超时,并且从客户端发送新的轮询(setTimeout("sendRequest("+uid+")",timeoutinmillisecs);
)。这称为长轮询,对于chats之类的应用程序来说,这比用空响应进行回复更有效。你可以在这里找到更多信息:How do I implement basic "Long Polling"?
这里:Make AJAX call wait for event in php
这里:Comet (programming)
[编辑]作为长轮询的一个非常需要和更有效的替代方案,现在所有主流浏览器都支持websockets。RFC6455已于2011年进入(拟定)标准状态(即已退出草案状态,此后未发生任何变化)。php中最好的实现可能是Ratchet(据我所知,目前为止的标准是the most up to date)。以下是如何使用它构建网络聊天的教程:http://socketo.me/docs/hello-world