2

ウェブサイトの「通知」システムのロングポーリングを検討しています。これまで行ったことがないので、オンラインで情報を探しています。私はここを見ています: http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery

ロングポーリングに関するセクションでは、次のように述べています。このポーリング関数は、ajax 呼び出しが完了して (少なくとも) 30 秒が経過するまで、再度呼び出されることはありません。」

ポーリングは、ajax 呼び出しが完了し、少なくとも 30 秒が経過するまで呼び出されません。

ただし、これを Javascript に追加すると、ajax 呼び出しが完了するまでの間に poll が何度も呼び出されます。30秒も待ちません。

(function poll() {

         $.ajax({ url: "/myapp/messages/messages/checkMessages", success:
         function(data){alert("YO");}, complete: poll, timeout: 30000 });

    })(); 

私は何か間違ったことをしていますか、それともポーリングが機能するはずの時間ですか?

また、これは効率的ですか?これはサイトのトラフィックに合わせて拡張できますか?

助けてくれてありがとう!

(function poll(){
           setTimeout(function(){
              $.ajax({ url: "/myapp/messages/messages/checkMessages", success: function(data){
                  console.log("Polling!");
              }, complete: poll, timeout: 30000});
          }, 30000);
        })();
4

4 に答える 4

4

通話のタイムアウトを設定すると、$.ajax通話の最大タイムアウトのみが設定されます。

つまり、最初の呼び出しが$.ajaxタイムアウト時間内に完了しなかった場合、ポーリングが再度呼び出されます。それ以外の場合、呼び出しが完了pollすると、再度呼び出されます。これによりpoll、タイムアウト時間より前に完了すると、繰り返し呼び出されます。

以下は、 (上記で行ったように)自分自身を繰り返し呼び出すことをpoll停止するsetTimeoutでラップしますpoll

(function poll(){
    setTimeout(function(){
        $.ajax({ url: "/myapp/messages/messages/checkMessages", success: function(data){
            console.log("Polling!");
        }, complete: poll, timeout: 30000});
    }, 30000);
})();

*注:より明確なものをお探しの方のために、回答を追加しました。

于 2013-03-14T07:37:44.097 に答える
2

長いポーリングを行う理由は、サーバー プッシュの効果を取得するためです。これは、サーバー側で予測できない遅延が発生することを意味します。その間、クライアント側は、サーバーがメッセージを送信するのを非同期的に待機していることが理想的です。サーバーはクライアントとの接続を開始できないため、クライアントは接続を開始し、サーバーが何かを言うのを待ちます。

それが念頭にある場合、AJAX 呼び出しにタイムアウトを課す理由はありません。サーバーへの接続が切断される可能性があるか、サーバー自体が無期限にハングする可能性があることを懸念している場合は、AJAX 呼び出しにタイムアウトを設定すると、指定された時間の後にクライアントが接続を再開します。 、サーバーが何かを送信したかどうかに関係なく。サーバーとの切断がなければ、クライアント側にタイムアウトがあってもまったく違いはありません。

元の質問は、サーバーがすべての ajax リクエストに即座に応答していると述べており、クライアント側でタイマー (タイムアウトではなく) が必要な理由は、サーバーとの会話を遅くすることだったようです。その場合、これは長いポーリングではなく、単純な単純なポーリングです。簡単に言えば、違いは次のとおりです。ポーリングでは、クライアントがサーバーから流れる情報のタイミングと頻度を制御します。ロング ポーリングでは、サーバーがタイミングと頻度を制御します。全体的な考え方は、データを送信するサーバーとそのデータに作用するクライアントの間の遅延をなくすことです。ポーリング側でタイマーを使用してサーバーからの応答を遅らせると、その目的が無効になります。

クライアント側でタイムアウトなしで効果的なロング ポーリングを実行できます。既に提供されている例のように、'complete:' 定義を使用して ajax リクエストを再開します。「成功」定義を使用して、データを処理します。XHR が成功したかどうかにかかわらず、'complete' が発生します。

切断された接続の影響を受けないようにしたい場合は、サーバー側でタイムアウトを行うことでデッドマン スイッチを実現できます。サーバーでは、送信するデータがない場合でもハートビートで応答します。success: 定義で、ローカルの最終ハートビート時刻を更新します。完全な: 定義では、サーバーのタイムアウトが設定されているよりも長くハートビートがない場合、パニックまたは失敗するか、やりたいことを行います。

于 2013-12-04T06:01:55.903 に答える
1

セッション ファイルのロックが発生したようです

PHPの場合

session_write_close()を使用する

于 2013-12-14T07:04:01.277 に答える