2

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

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

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

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

4

2 に答える 2

3

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

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

于 2008-12-02T14:40:04.037 に答える
0

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

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

于 2008-12-02T14:38:31.137 に答える