2010-12-13 14 views
2

私は、ユーザがユーザ名でログインできるように設定した簡単なチャットクライアントを用意しています。 3秒ごとに、データベースは単純にすべての行を印刷します。基本的にチャットクライアントです。ユーザーがブラウザを閉じたときを知る方法?チャットアプリケーション

オンラインのユーザーのリストを保持したいと考えています。これどうやってするの?誰かがブラウザを閉じた時をどう思いますか?

今私は

$name = $_COOKIE["name"]; 

としてユーザー名を引っ張っだし、この値が空の場合、私は彼らが残って知っています。しかし、一度彼らが出発すると、ユーザー名が何であるかを知るには遅すぎるので、正確に何者かを追跡することはできません。

アイデア?私はかなりphp、javascript、htmlの新機能ですので、心に留めておいてください:)

+0

ehmad1 @道!いいぞ! – Mike

答えて

1

置くオンラインユーザー..:

window.setInterval(function() { 
    $.ajax({  
     url: _URL_ENGINE + "/updateLastSeen/?userid=" + userID, 
     success: function(data) { 

     } 
    }); 
}, 2000); // 2000 means 2 seconds 

オンラインプレイヤーのリストを照会するためにuは

select * from players WHERE lastSeen > DATE_SUB(NOW(), interval 40 SECOND) 

希望のようにそれらを照会することができ、この

0

onbeforeunloadイベントを使用してください。

+0

heres a sample http://www.4guysfromrolla.com/demos/OnBeforeUnloadDemo1.htm – basarat

+4

これは信頼できる方法ではありません.AJAXリクエストを送信したときにそのリクエストが処理されないときに処理される可能性があります。 – fire

3

AJAXを使ってチャットメッセージをX秒ごとに取得すると仮定すると、その時点のユーザーテーブルをそのユーザーの現在のタイムスタンプで更新します。タイムスタンプを持っている人は誰でも、10秒以上経過していると言うと、ページを離れたことを知ることができます。

+0

up vote私はまた、いくつかのコードサンプルを追加 – ehmad11

5

ユーザーがウィンドウを閉じることを望むとき(通常、onbeforeunloadの場合のように)、ブラウザは通常、JS実行が完了するのをブラウザが待たずに、ウィンドウを閉じるときにサーバーに最後の要求を送信することは困難です。

私はこのような状況に直面するときはいつも、最後のリクエスト(ブラウザウインドウが閉じられる前に完了します)を送るのに、onbeforeunloadを使う傾向がありますが、タイムアウト機能も実装しています。タイムアウト機能は、次のように機能します。

ユーザーが何かをサーバーに送信するたびに、サーバーはこれを「まだ存在する」と認識します。同時に、クライアントは、例えば45秒のタイマーを設定する。ユーザーが45秒間何も入力しなかった場合、クライアントは接続を維持するために 'まだ生きている'信号を送信します。

今度は、サーバは60秒ごとに遅い接続マージン(15秒の遅い接続マージンを許し、したがって45/60秒)を実行するようにremoveInactive()ルーチンを実行する必要があります。最後に 'まだ生きている' 60秒。

このシステムは今まで私にとってはうまくいきましたが、あなた自身で試してみることができます。このようにいろいろ書いを行うことが

AJAX呼び出し、このフィールドAJAX呼び出しと、数秒ごとに「lastSeen」アップデートのような名前のフィールドを持つことになりますテーブル内の

関連する問題