2016-04-05 4 views
1

私はまだチャットシステムを開発しています。ユーザーがログインすると、「{ユーザー}がチャットに入った」というメッセージが表示されます。チャットに表示されます。同様に、ユーザーがログアウトすると、「{user}さんはチャットを終了しました」というメッセージが表示されます。表示されます。ユーザーが正式にページを離したか入力するかを判断する方法

これらの機能はどちらもそのまま正常に動作します。しかし、ユーザーがページを閉じたとき(メッセージを残す)といつ戻るか(メッセージを入力する)を決定したいと思います。

ややこれを達成するために、私は次のようにします。

1、メインのチャットページ(chat.php)で、私は、ユーザーが残しonpage

2と呼ばれるセッションを設定しますページ、次のスクリプトは、AJAX(jQueryの)を介してonbeforeunloadイベントで実行されます:

//setoffline.php 

    unset($_SESSION["onpage"]); // unset the session 
    if ($_POST['logout'] == "false") { // in our case, this will evaluate true 
     sleep(3); // halt the script for 3 seconds 
     if (isset($_SESSION["onpage"]) || !empty($_SESSION["onpage"])) 
      die(); 
     } 
    } 
    // if continued, send the offline message 
    ... 
    $_SESSION["left"] = "true"; 

3を、スクリプトが実行され、その後、ユーザーは3以内に返品した場合(セッションがまだ存在しているかどうかをチェックする前に、3秒間スリープ秒セッションはリセットされていました)。そうでない場合、スクリプトは完了し、離脱メッセージが送信され、セッションleftが設定されます。

4ユーザーが戻ると、セッションleftをチェックするonload関数がトリガされます。設定されている場合は、入力メッセージが送信され、セッションleftは設定解除されます。

問題:今では

、私はあなたが私のアルゴリズムで問題を識別していることを確信しています。私は自分自身で多くの問題を参照してください。 1つは、sleep関数を使用しても正しくないと思われたり、正常に動作しません。 (3秒以内に誰も返さないので)ページを閉じるときに正しく動作しますが、リフレッシュすると、ページが3秒間停止する原因となります。私は単に、ユーザーが公式に辞めて共役に戻ったときを特定する方法を必要としています。

+0

すべてのユーザーが独自のセッションを持っていることをご存知ですか? – delueg

+0

それは問題ではありません。ユーザーがページを閉じると、すべてのユーザーが自分のセッションヘルプを持っていることから、ユーザーはチャットを終了したことをどのように通知しますか? @delueg – Shawn31313

+0

新しいチャットメッセージが来たら、ブラウザをどのように更新しますか?ポーリングの一種?多分、ポーリングデータは、チャットにログインしているユーザーのリストを返す可能性があります。その後、どのチャットルームからチャットを終了したかを確認することができます。 (onbeforeunloadを使用して、ユーザーをログアウトさせるコマンドを送信するか、チャットを終了したとマークする)。 –

答えて

1

最良の解決策は、5秒または10秒後にサーバーにAJAXを呼び出すことです。このAJAXリクエストは、ブラウザでページが開かれているすべてのユーザーに関して、サーバーDB上の最後のオンラインステータス(datetime)を変更します。

ページを離れる場合は何もしないでください。この場合、AJAXリクエストは呼び出されず、最後のオンライン時間は更新されません。

ここで、そのユーザーがオンラインになって、オフラインになっていることを示している相手側。 5秒または10秒前に誰がオンラインになったのかを判断する別のAjaxリクエスト(5秒または10秒ごと)がサーバーからデータを取得します。ユーザーの過去の統計情報と現在の統計情報に基づいて、各ユーザーのオンライン/オフラインのステータスを判断できます。

ご理解ください。

0

もう1つの答えで言及されている1つのオプションは、すべてのクライアントに一定の間隔でサーバーをポーリングさせることです。次に、サーバーは、最近ポーリングしていないクライアントが「残っている」と仮定します。このアプローチの大きな欠点の1つは、多くの帯域幅を使用することです。

別のアプローチは、メッセージをいつ各クライアントに表示するかを決定するロジックを移動することです。ユーザーが部屋を離れると、サーバーは何らかの形で部屋の他の人にその人が残っていることを通知します。クライアントがそのメッセージをすぐに表示するのではなく、setTimeoutを使用し、同じユーザーが部屋に戻ってきたことを示す別のメッセージをサーバーが送信したかどうかを確認することができます。ユーザーに関連付けられた一部のHTMLブロックにdata属性を使用すると、その属性が残っている可能性があり、返されたことを記録できます。


限り、様々なクライアントと私はBOSHと呼ばれる手法を検討して推薦するサーバー間の接続を維持する方法として。

​​は、BOSHが何であるか、そして常にサーバーを常にポーリングするなど、他の選択肢より優れている理由を紹介しています。

関連する問題