質問

所有者がDBバックエンドのすべてのユーザーのサイトで費やした時間(ログイン/ログアウト)を追跡したいメンバーベースのサイトに変更を加えています。ログインは簡単です。エントリポイント(ログインフォーム)が1つあるため、ログインが発生するとすぐにデータベースにスローされます。

ただし、ユーザーが「ログアウト」をクリックしてソリューションから離れることを明示的に通知しない限り、ログアウトは少し難しくなります(そしてユーザーがログアウトをクリックする頻度は本当にか? )。 1つの可能性(サイトの合計時間を追跡するという点で)は、各ページロードをデータベースに登録し、それをロードしたユーザーに関連付けることです。問題は、サイトが会員制の動画配信サイト(あなたが思っているものではない!)であり、最後のページビューが20分または30分の動画になる可能性が高いことです。ロードされた時間だけでなく、最後のページで費やされた時間もキャプチャする必要があります。

2つの解決策を考えましたが、どちらもそれほどエレガントではありません。 1つは、javascriptを介してすべての「アンロード」イベントをトラップし、「logout.php」への呼び出しを登録することです(これは、XMLHttpRequestまたはページがアンロードされるとすぐに死なないものを想定しています)。問題は、内部リンクもアンロードイベントとして登録されるため、任意のリンクをクリックするとユーザーがログアウトすることです(「アンロード」ハンドラーでフラグをチェックし、すべての内部リンクにそのフラグを設定することができます-難しくありません)動的に、しかし少しぎこちない)。もう1つのアプローチでは、60秒ごとにDBにpingを実行する間隔を設定します。これにより、ユーザーがまだサイトにいることがわかり、ユーザーの履歴を取得してそのセッションの合計時間を把握するときに計算が行われます;それも一種のハックのようです。また、これらのソリューションはいずれも、JSが無効になっているユーザーには機能しません。

この問題はそれほど珍しいことではないようで、より良い方法が必要です。これを解決するためのベストプラクティスのアプローチはありますか?そうでない場合、これらのソリューションのいずれかを改善する方法はありますか?

役に立ちましたか?

解決

Webは、ログアウトイベントを正確に追跡できるようには構築されていません。ユーザーが終了したときにブラウザから通知を受け取ることは保証されていないため、通常の状況では、セッションタイムアウトイベントをトラップすることをお勧めします。このイベントは、ユーザーがページを放棄した20分後まで発生しません。

「ハートビート」を提供するために各ページのタイマーにajaxリクエストを(おそらく1分間に1回または2回)入れることでこれを少し改善できますが、これにはいくつかの注意事項があります:セッションが最終的にタイムアウトすることを確認してください。また、おそらくjavascriptを無効にすることで、ユーザーがこれらのリクエストをブロックしないことが保証されていません。

他のヒント

JavaScriptでタイマーを使用してサーバーにpingを送信することに成功しました。私の場合、サイトにはjavascriptが必要なので、これは問題ではありません。また、このメカニズムを使用して、2つの異なるマシンから1つのアカウントがログインするのを防ぐチェックを実行するため、このハッキングを行うより説得力のある理由があります。

アンロードで留意すべきことの1つは、アンロードイベントが常に発生するという保証がないことです。たとえば、ラップトップを閉じるだけの人がラップトップにいるので、タイマーのアプローチはおそらくもう少し正確になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top