php - ロングポーリング-メッセージシステム




jquery ajax comet (3)

last_checkedという名前の列を作成する代わりに、:checkedという名前の列を作成できます。 すべてのメッセージをデータベースに保存すると、データベース内のフィールドを更新できます。 例:

  1. ユーザー1がユーザー2にメッセージを送信します。
  2. PHPはロングポーリングシステムを使用してメッセージを受信し、そのメッセージをテーブルに保存します。
  3. オンラインの場合、ユーザー2はサーバーに信号を送信し、ユーザー1がメッセージを受信する準備ができていることをサーバーに通知します。
  4. サーバーは、チェックされていないすべてのメッセージについてテーブルをチェックし、それらを返します。

私はメッセージシステムのためにjQueryとPHPでいくつかの長いポーリングをすることを検討しています。 私はこれを達成するための最善/最も効率的な方法を知ることに興味があります。 私は、この単純なロングポーリングの例から抜け出しています。

ユーザーが受信トレイページに座っている場合は、新しいメッセージを取り込みます。 私が見た1つのアイデアは、メッセージテーブルにlast_checked列を追加することです。 PHPスクリプトは次のようになります。

query to check for all null `last_checked` messages
if there are any...
while(...) {
    add data to array
    update `last_checked` column to current time
}
send data back

私はこのアイデアが好きですが、私は他の人がそれについてどう思うか疑問に思います。 これはこれに近づくための理想的な方法ですか? どんな情報でも役立つでしょう!

付け加えると、サイトにはあり得る用途の数が決まっていないので、それを実行するための効率的な方法を探しています。


last_checkedとして新しい列を追加する代わりに、 last_checkedとして追加できます。 そのため、 last_checked_timeからcurrent_timeまでのデータを取得できcurrent_time

(i.e) DATA BETWEEN  `last_checked_time` AND `current_time`

ユーザーが1人しかいない場合は、それで問題ありません。 そうでなければ、合併症に遭遇するでしょう。 これを実行して、大量のSELECTクエリの1つを実行することもできます。

PHPはクロスクライアントのイベント駆動型の可能性を持っていないため、PHPとロングポーリングはネイティブには機能しません。 つまり、イベントに頼るのではなく、毎秒/ 2秒/ 5秒ごとにデータベースをチェックする必要があります。

それでもこれをやりたいのであれば、私はあなたのメッセージングシステムにユーザがメッセージを持っている時はいつでもディレクトリにファイル[nameofuser] .txtを書き、そしてこのトリガを使用してメッセージの存在をチェックさせるでしょう。 ファイルが存在し、空でない場合は、メッセージを取得し、処理し、フィードバックしてからテキストファイルを削除する要求を起動します。 これはあなたのSQLオーバーヘッドを減らすでしょう、(あなたが注意深くないなら)あなたのディスクIOを増やす間。

構造的には、連想テーブルははるかに優れています。 ステータスチェック専用の新しいテーブルを3つの列で作成しuser_id read_at message_id read_at 。 使い方は明らかです。 そこにない組み合わせは未読です。





long-polling