4

我正在制作一个聊天框,一切正常,除了更新。 我目前每 3 秒刷新一次页面以检查任何新消息,但这肯定会导致服务器负载过重,而且不优雅。

我想要的是,聊天框只会在数据库更新时检查新消息,而不是每 3 秒检查一次数据库的计时器

4

1 回答 1

6

您想要 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);。这称为长轮询,对于诸如聊天之类的应用程序来说,比回复空响应更有效。

您可以在此处找到更多信息:如何实现基本的“长轮询”?

在这里:让 AJAX 调用等待 php 中的事件

在这里:彗星(编程)

[编辑] 作为长轮询的一个非常需要和更有效的替代方案,现在所有主要浏览器都支持websockets。RFC6455已于2011 年进入(提议的)标准状态(这意味着它已退出草案状态并且此后没有任何更改)。PHP 中最好的实现可能是Ratchet(据我所知,这是迄今为止最新的标准)。这是一个关于如何使用它构建网络聊天的教程:http: //socketo.me/docs/hello-world

于 2012-08-10T18:42:45.697 回答