2

I am making a notification system for my website. I want the logged in users to immediately noticed when a notification has made. As many people say, there're only a few ways of doing so.

One is writing some javascript code to ask the server "Are there any new notifications ?" at a given time interval. It's called "Polling" (I should be right).

Another is "Long Polling" or "Comet". As wikipedia says, long polling is similar to polling. Without asking everytime for new notifications, when new notifications are available, server sends them directly to the client.

So how can i use Long Polling with PHP ? (Don't need full source code, but a way of doing so) What's its architecture/design really ?

4

4 に答える 4

3

ロング ポーリングの基本的な考え方は、要求を送信した後、サーバーによって応答または終了されないということです。つまり、サーバー側は、応答を送信して要求の処理を「終了」しません。これは、サーバー側で実行をループに保つことで実現できます。

各ループでデータベース クエリを実行するか、必要な条件が真であるかどうかを確認するために必要なことを想像してみてください。IS の場合のみ、ループを中断してクライアントに応答を送信します。クライアントが応答を受信すると、すぐに「ロングポーリング」リクエストを再送信するため、次の「通知」を見逃すことはありません。

このためのサーバー側 PHP コードの単純化された例は次のようになります。

// Set the loop to run 28 times, sleeping 2 seconds between each loop.
for($i = 1; $i < 29; $i++) {

    // find out if the condition is satisfied.
    // If YES, break the loop and send response     

    sleep(2);
}
// If nothing happened (the condition didn't satisfy) during the 28 loops,
// respond with a special response indicating no results. This helps avoiding
// problems of 'max_execution_time' reached. Still, the client should re-send the
// long-polling request even in this case.
于 2013-02-18T17:31:31.727 に答える
1

最近、チャット アプリケーションにロング ポーリングを使用しました。いくつかの調査を行い、しばらく遊んだ後、私が推奨するいくつかのことを次に示します。

1) 約 20 秒以上長くポーリングしないでください。一部のブラウザはタイムアウトします。私は通常、ロング ポールを約 20 秒実行するように設定し、その時点で空の応答を返します。その後、javascript を使用して長いポーリングを再開できます。

2) ときどきブラウザがハングアップします。2 番目のレベルのエラー チェックを追加するために、JavaScript タイマーを 30 秒間実行し、30 秒以内に応答がない場合は、ajax 呼び出しを中止して再度開始します。

3)phpを使用している場合は、必ず使用してくださいsession_write_close()

4)Jqueryでajaxを使用している場合は、使用する必要があるかもしれませんabort()

于 2013-02-18T18:48:12.937 に答える
1

Ratchetのようないくつかの既存の実装を使用 (または調査) できます。他にもいくつかあります。

基本的に、Apache や Web サーバーでリクエストを処理することは避ける必要があります。node.js サーバーの場合と同様に、コマンド ラインから PHP を起動し、サーバー ソケット関数を使用してサーバーを作成し、socket_select を使用して通信を処理できます。

ループをアクティブに保つことにより、技術的には Web サーバーを介して機能する可能性があります。ただし、HTTP 接続ごとに php プロセスをアクティブに保つためのメモリ オーバーヘッドは、通常は高すぎます。独自のサーバーを作成すると、接続間でメモリを共有できます。

于 2013-02-18T17:37:00.897 に答える
0

ここで答えを見つけることができます。詳細はこちら$.ajaxSetup({ cache:false });また、jqueryを使用するときは忘れずに使用する必要があります。

于 2013-02-19T16:11:00.613 に答える