2009-03-20 3 views
1

私は、ユーザーが技術的にブラウザを閉じることがない(したがって新しいセッションキーを取得しない)限り、永遠にログインしたままのサイトを作っています。ここで私は起こっていることがわかります。ユーザーはコンピュータAでブラウザを開いたままにしてから、コンピュータBを使用してログインし、セッションに保存されている名前を変更します。彼らはBをログアウトしますが、Aはまだログインしていて、セッションに古い名前が保存されています。したがって、次回のログアウト時に手動でログアウトしたり、ブラウザを閉じて再度開いたりするときに、その名前は更新されず、remember me機能によってログインされます。ユーザーがログインしたままセッションを処理する最善の方法はありますが、別の更新が原因でセッションキーを更新する必要がありますか?

名前は単純な例ですが、私の場合は自分のアカウントのサブスクリプションレベルは、セッションに格納されており、変更することができます。

これはどのように処理しますか?私が持っている

いくつかのアイデアがあります:

  1. 10分以上の期間の後、セッションデータはの再読み込みを取得します。ユーザーが非常にアクティブな場合、10分後に機能が開始されるか、ユーザーが離脱して戻って機能をトリガーすると2時間後になる可能性があります。セッション中にできる限り少ない情報として

  2. ストアとすべてのページの呼び出しにDBからの残りをロードします。

  3. 使用したデータベースセッションを(私は本当に。このアイデアを好きではない)と、すべてのコンピュータ上で同じセッションを使用します。私はこれが好きですが、検索基準のようなものがセッションに格納されているときに混乱しているのがわかりました。同じ基準が両方のブラウザ/コンピータに表示されます。

  4. ユーザーの名前やユーザー名/電子メールアドレスなどの情報については、セッションに格納してください。ただし、サイトの能力に大きく影響する情報については、セッションに保存して読み込まないでください必要に応じて(インスタンスごとに1回だけ実行しようとします)。

もっと良い方法がありますか?

- 別のオプション:5.データベースセッションを使用し、更新が行われたときにユーザーの他のセッションを読み込み(シリアル化を解除するだけ)、関連情報を変更してデータベースに戻します。

+0

私は3があなたの問題を解決するとは思わない - それぞれのクライアントコンピュータはまだ異なるセッションIDを持っているので、依然として別々のセッションがある。ファイルベースのセッションとは異なる動作をするべきではありません。 –

答えて

1

通常は2)を行う必要がありますが、あなたはそれを好きではありません。 おそらく、dbに格納されたセッションを使用できます。 ユーザーが自分の名前を変更したときに、そのユーザーからのすべてのセッションに情報「refresh userdata」を挿入します。 次の要求では、userdataがセッションに再度読み込まれ、そこでキャッシュされます。 ログイン時に呼び出されたloaduserdata関数を再利用することができます。

php session_set_save_handler() - も

php session_decode()コメントを読む - SessionDataにに加えて、それを保存するためにセッションからユーザー名を読み取るために。更新のためのユーザーセッションを簡単に見つけるのに便利です。 ページが生成されている間に(session_startとsession_write_closeの間に)すべてのセッションを更新すると、変更内容が失われる可能性があります。

1

私は番号1または番号4のいずれかを使用します。情報の最終更新時刻を保存する場合は、日付が更新されたかどうかを毎回尋ねることもできます。

1

概要のようなシナリオを見ていると、セッションで変更される可能性のある情報は保存しないでください。すべてのページでユーザーデータを読み込むというあなたの嫌悪感を乗り越えてください。これははるかに良いアイデアです。

何らかの理由でパフォーマンスの問題が懸念されているため、データベースからデータをロードしたくないと思います。他のソリューションを試す前に、実際にデータベースからユーザーデータをロードするのにかかる時間をテストしてから、それをユーザー数と照らし合わせてチェックすることをお勧めします。すべてのページにユーザープロファイルを読み込みます。

よろしく

1

私はオプション6と一緒に行きたい:(複数のサーバーを使用している場合はmemcachedの)彼のセッションでのみストアユーザーIDとセッション固有のもの(検索条件)とAPC/XCacheとに休憩を入れました。

この方法で初めてデータベースにアクセスするだけで(キャッシュが期限切れになった後も)、ユーザーセッション間でデータを共有できます。

関連する問題