2

短いポーリング(AJAX更新)を使用した単純なPHPjQueryチャットアプリケーションを作成しました。同様に、2〜3秒ごとに新しいメッセージを要求します。しかし、私は、ロングポーリングがチャットアプリケーションにとってより良いアプローチであることを読みました。それで、私はいくつかのロングポーリングスクリプトを実行しました。私はこのように作りました:

Javascript:

$("#submit").click(function(){
    $.ajax({
        url: 'chat-handler.php',
        dataType: 'json',
        data: {action : 'read', message : 'message'}
    });
});

var getNewMessage = function() {
    $.ajax({
        url: 'chat-handler.php',
        dataType: 'json',
        data: {action : 'read', message : 'message'},
        function(data){
            alert(data);
        }
    });

    getNewMessage();
}

$(document).ready(getNewMessage);

PHP

<?php
    $time = time();
    while ((time() - $time) < 25) {
        $data = $db->getNewMessage ();

        if (!empty ($data)) {
            echo json_encode ($data);
            break;
        }

        usleep(1000000); // 1 Second
    }
?>

問題は、一度getNewMessage()起動すると、(chat-handler.phpから)何らかの応答がない限り実行されることです。再帰的に実行されます。しかし、誰かがその間にメッセージを送信したい場合、実際には、その関数はまだ実行($("#submit").click())されているように実行されることはありませんgetNewMessage()。それで、回避策はありますか?

4

2 に答える 2

5

長いポーリングの背後にある考え方とjQueryコールバックの2つをよく読んでおくことを強くお勧めします。すぐに両方について説明しますが、このボックスで可能な限り詳細に説明します。

長いポーリング

長いポーリングの背後にある考え方は、リクエストを返すときにWebサーバーを人為的に「スローダウン」させて、イベントが発生するまで待機し、すぐに情報を提供して接続を閉じることです。これは、メッセージが通過した情報を最終的に取得し、それをクライアントに送り返して次の情報に進むまで、サーバーがしばらくアイドル状態になることを意味します(アイドルではありませんが、私が何を意味するかはわかります)。 1。

JSクライアント側では、Ajaxコールバック(これは重要なビットです)が遅延するという影響があります。

jQuery .ajax()

$.ajax()すぐに戻ります。これは良くない。これを修正するには、2つの選択肢があります。

  • 成功およびエラーのコールバック関数で再帰呼び出しをバインドします(これは重要です。タイムアウトが原因でエラー関数が発生する可能性があります)
  • (下記参照):

これを使って:

var x = $.ajax({blah});
$.when(x).done(function(a) { recursiveCallHere(); });

どちらも最終的には同じものになります。開始時ではなく、コールバック時に再帰をトリガーしています。

PS:何が問題なのsleep(1)ですか?

于 2012-11-17T22:55:48.290 に答える
3

長いポーリングでは、前の要求からデータを受け取ったときに新しい要求を開始する必要があります。そうしないと、ブラウザのフリーズが無限に繰り返されます。

var getNewMessage = function() {
    $.ajax({
        url: 'chat-handler.php',
        dataType: 'json',
        data: {action : 'read', message : 'message'},
        success: function(data) {
            alert(data);

            getNewMessage();   // <-- should be here
        }
    });
}
于 2012-11-17T22:53:59.397 に答える