12

コメントシステムの一部として他にログインしているユーザーを表示したいと思います。ユーザーを追跡するためのベストプラクティスは何ですか?例えば:

すべてのセッションを追跡してから、それらをクローズとしてマークしますか。または、ログアウト時にユーザーを削除して、アクティブなユーザーのみを追跡しますか。

ユーザーID、ログイン時間、ログアウト時間、ステータスを含むテーブルを作成する必要があると考えています。それが進むべき道ですか、それともセッションIDを追跡する別のアプローチがありますか。テーブルを使用する場合、sessionidを維持することに価値はありますか。セッションがアクティブでなくなったときに行を削除して、whenloggedoutフィールドの必要性を否定する必要があります。

ログインしているユーザーを追跡するのはとても簡単なログインがあります。ただし、ブラウザのクラッシュなどによってセッションが中断される可能性があるため、ログアウトしているユーザーを追跡するのは困難です。

セッションを破壊していない限り、ユーザーがログインしていると見なすのがベストプラクティスですか?たとえば、FBとGmailを使用すると、ほぼ無期限にログインしたままになります。または、前回のアクティビティからの時間制限が必要ですか?現場で活動するたびにこのテーブルに保存するという考えは魅力的ではありません。

今、私は次のことを考えています:

create table loggedin (userid (int), whenloggedin (datetime), whenlogged out (datetime), loggedin(tinyint))

後者は、ログアウトしたときにnullでない場合、または24時間などの長い時間制限の後、0になります。FBは、長時間ログインしたままで、チャットなどの目的でアクティビティを追跡していると思いますが、よくわかりません。閉じたセッションを削除するのではなく、テーブルを拡張することも考えていますが、それは間違いかもしれません。

このアプローチは適切であると考えられますか、それともより良い方法がありますか。これに関するアドバイスのための多くのthx。

4

3 に答える 3

13

それをどのように機能させたいかに応じて、基本的に2つのオプションがあります。

  • ユーザーがログアウトしたと見なすまでのタイムアウトを定義します
  • ajax /websockets/その他を使用してユーザーをポーリングします

1:タイムアウト

これは、より単純なユースケースです。ユーザーがページをリクエストするたびに、データベースのタイムスタンプを更新します。

オンラインになっているユーザーの数を確認するには、このデータベースに対してクエリを実行し、過去N分間にアクティブだったユーザーの数をカウントします。

このようにして、現在サイトをアクティブに使用している人の数を比較的正確に把握できます。

2:コンスタントポーリング

サーバーをAjaxで更新する必要があるため、これは実装が少し複雑です。それ以外は、#1と同じように機能します。

ユーザーがページを表示しているときはいつでも、WebSocketを開いたままにするか、サーバーに対してN秒ごとにajaxリクエストを実行できます。

このようにして、現在サイトでページを開いているユーザーの数をかなり把握できますが、ユーザーがブラウザでページを開いたままにして何もしなかった場合でも、オンラインであると見なされます。

アイデアのわずかな変更は、クライアントでスクリプトを使用してマウスの動きを監視することです。ユーザーがページ上でマウスをたとえば10分間動かさない場合は、ポーリングを停止するか、WebSocketを切断します。これにより、アイドル状態のユーザーがオンラインであると表示される問題が修正されます。

于 2012-04-20T10:42:57.853 に答える
6

ユーザーがログアウトしたかブラウザがクラッシュしたかを知ることに関する問題を回避するために、ここではハートビート/ポーリングを使用することです。これは、jQueryでそれを行う方法の簡略化された例です。

function heartbeat(){
   setTimeout(function(){
      $.ajax({ url: "http://example.com/api/heartbeat", cache: false,
      success: function(data){
        //Next beat
        heartbeat();
      }, dataType: "json"});
  }, 10000);//10secs
}

$(document).ready(function(){
    heartbeat();
});

http://example.com/api/heartbeatセッションを存続させ、データベース内のタイムスタンプを更新します。次に、ページの読み込みごとに、現在の時刻などのタイムスタンプを確認し、それより短い場合は15秒とするとログアウトします。

于 2012-04-20T10:48:09.207 に答える
1

常時ポーリングとハートビートの使用は良い考えですが、シナリオによっては、サーバーに無用な負荷がかかる場合があります。特に変更がロード時間に与える影響を考慮すると、ユーザーを追跡し、それを非常に適切に使用することの重要性を検討する必要があると思います。

于 2013-05-08T02:48:48.543 に答える