phpとajaxを使用してチャットシステムを作成しました。ユーザーがこのチャットシステムにログインすると、テーブルis_online
フィールドのステータスが1に更新されます。このフィールドを使用して、現在のオンラインメンバーを一覧表示しています。
ユーザーがログアウトを押さずにWebサイトのすべてのタブを閉じる場合は、ステータスを0に更新する必要があります。
どうすればいいですか?
失敗の証拠、リアルタイム、効率的な方法はありません
理論的には、ブラウザの状態を安全に判断する方法はありません。DOMonunloadやonbeforeunloadイベントなどのイベントがあります。そのイベントへの応答としてAJAXリクエストを添付できるかもしれません。それが設定されonline=0
ます。ただし、問題は、このイベントが常に発生するという保証はないということです。(ブラウザのプロセスが強制終了されるとどうなりますか?)
唯一の標準的な解決策は、定期的に非常に軽いAJAXリクエストをサーバーに送信することです。サーバー側のプログラムは、各ユーザーのフィールドを維持し、lastSeenAtTime
特定の時間内に要求を受け取らない場合は自動的にゼロに設定する必要があります(10分など)。
テーブル内の最後のメッセージ/アクションを追跡します。カウンターを更新するには、最後のアクションが1分前などであったものだけを選択します。また、必要に応じて、is_onlineを使用して、ログアウトを追跡します:)
本当に悪い方法。
online_users
フィールドname
とを含むテーブルを作成しますtimeout
。ユーザーの名前(またはID、またはその他のID)と現在のタイムスタンプ+ 5分(または別のしきい値、ユーザーが決定)を保存します。
timeout
オンラインユーザーを表示するときは、そのテーブルから現在のタイムスタンプよりも大きいすべてのユーザーを選択します。例:
$time = time();
$result = mysql_query("SELECT `name` FROM `online_users` WHERE `timeout` > '$time'");
そして、1日1回テーブルをクリーンアップするCRONをセットアップします。
そして、更新することを忘れないでくださいtimeout
。
たとえば、ユーザーがコンピューターをシャットダウンしたときのyahoo msgrのように、ユーザーのアクティビティを5分ごとに確認する必要があると思います。yahooはまだオンラインステータスを示していますが、5分後にはオフラインになります。その私のアルゴリズム。私はあなたが毎秒チェックすることができないと思います、そしてそれはあなたのチェック時間のために遅れがあります