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
}

while (($msg=new_msgs()) === false) {sleep(timeout);}ここで、サーバー (process_request.php) からの応答を、送信するものがあるまで (たとえば、次のようなものを使用して) 遅らせるか、要求がタイムアウトしてクライアントから新しいポーリングが送信される ( ) まで遅らせたいと考えていますsetTimeout("sendRequest("+uid+")",timeoutinmillisecs);。これはロング ポーリングと呼ばれ、チャットなどのアプリケーションでは、空の応答で応答するよりも効率的です。

ここで詳細情報を見つけることができます:基本的な「ロングポーリング」を実装するにはどうすればよいですか?

そしてここ:AJAX呼び出しをphpでイベントを待つようにする

そしてここ:彗星(プログラミング)

[編集] 非常に必要とされ、ロング ポーリングのより効率的な代替手段として、すべての主要なブラウザーがwebsocketsをサポートするようになりました。RFC6455は、2011 年に (提案された) 標準のステータスに入りました(つまり、ドラフト ステータスを終了し、それ以来変更されていません)。PHP での最適な実装は、おそらくRatchetです(私が知る限り、標準に準拠した最新のものをはるかに超えています)。これを使用して Web チャットを構築する方法に関するチュートリアルを次に示します: http://socketo.me/docs/hello-world

于 2012-08-10T18:42:45.697 に答える