2012-05-25 12 views
8

私はスケーラビリティを念頭に置いて私のプロジェクトを開発しています。私はクロスロードに来ました。私のウェブサイトでは、ユーザーがオンラインであるかどうかを検出したいと考えています。そして、私はこれを処理する最善の方法を考えることはできません。 Iユーザーがログインがtrueに彼のonline列を更新することができたときにPHP:ユーザがオンラインである場合の最も効率的な追跡方法

// SQL user table: 
user { 
    "name": "blah blah", 
    "email": "[email protected]", 
    "online": false 
} 

ので:私は考えていた方法は、これらの線(擬似コードで)に沿ったものになるだろう。しかし、それは最終的にユーザーがログインするたびに起こるSQLクエリーにつながります。もし起これば、毎秒10回のログインと言えます。それはたくさんのクエリーです。

// Activity table: 
activity { 
    "user_id": 2, 
    "online": true 
} 

私はそれが理由userテーブルからの分離の少ないメモリ消費につながると考えているいくつかの理由:私は同じことを行うが、別のテーブルに可能性が考え出しもう一つの方法。しかし、実際にパフォーマンスに影響を与えるかどうかはわかりません。

私の洞察力で私を祝福できたら、私はもっと感謝しています。ありがとう。

+0

これは時期尚早の最適化のようです。私は今のところそれについて心配しないだろう。あなたのサイトが遅くなってきたら、これ以上のボトルネックを明らかにすることができます。 – Okonomiyaki3000

+0

新しいページが読み込まれるたびに、多くのSQLクエリを実行するのが一般的です。 1つの追加のクエリは目立たないでしょう。 – xbonez

答えて

8

一般に、lastActivityの時刻を格納するためにusersテーブルに列を追加するのが一般的です。ユーザーがログインしたり、ページにアクセスしたりするたびに、そのフィールドに現在の時刻を格納します。 のオンラインであるかどうかを知りたい場合は、最後に記録された時間が特定のウィンドウ内にあるかどうかを確認します。すべての行を照会して、現在オンラインになっているユーザーの数を確認することができます。

私は、数秒ごとにクエリを実行することについてあまり心配する必要はありません。サーバはそれを処理できます(これらはよく書かれており、あまり冗長ではないと仮定します)。

を定義します。

+0

素晴らしいアイデアありがとう! – Brandon

0

あなたは基本的に2つのオプションがあり、フィールドタイプのための日時を使用することができますし、あなたはそれが仕事をしたいかに応じて、

0

O時間を追跡できるように、ユーザーのIPを記録することを忘れないでくださいユーザーがこれは単純なユースケースであるユーザー

 1: Timeout 

をポーリングするためにどんな/ 使用AJAX/WebSocketををログアウト検討した後のタイムアウト。ユーザーがページを要求するたびに、データベースのタイムスタンプを更新します。

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

このようにして、現時点でサイトの何人のユーザーが積極的に使用しているかを比較的正確に把握できます。

 2: Constant polling 

これは、サーバーをAjaxで更新する必要があるため、実装するのが少し複雑です。それ以外の場合は#1と同様に動作します。

ユーザーがページにいるときはいつでも、WebSocketを開いたままにしたり、サーバーにN秒ごとにajax要求を出したりできます。

このようにして、あなたのサイトに現在何人の人がページを開いているかを知ることができますが、ユーザーがブラウザでページを開いたまま何もしないと、オンライン。

考え方を少し変更すると、マウスの動きを監視するためにクライアント上のスクリプトを使用することになります。ユーザーがページ上でマウスを10分間動かさない場合は、ポーリングを停止するか、WebSocketを切断します。これは、アイドル状態のユーザーをオンラインにするという問題を解決します。

関連する問題