4

codeigniter を使用してセッションをデータベースに保存するのに問題があります。

ユーザーがログインすると、セッションが作成され、データベースに保存されます。データはデータベースに入力されます。ユーザーがログアウト ボタンを使用すると、セッション データは空になりますが、セッションはデータベースにまだ存在します。

問題は、ユーザーがログアウト ボタンを使用せずに Web ブラウザーを閉じた場合です。セッション データは空にはなりませんが、ユーザーはログアウトしたままです。(設定ファイルでこれを設定しました)セッションはデータベースで破棄されるはずですが、そうではありません!

ユーザーが「ログアウト」ボタンをクリックした後に再度ログインすると、ユーザーが最初にログインしたときに作成されたセッションにデータが再び入力されます。したがって、これで問題はありません。

しかし、ユーザーがブラウザーを閉じた後に再度ログインすると、新しいセッションが作成されます。

この問題は、ユーザーがブラウザーを閉じるたびにセッションが作成され、セッションが無限に続くことになります。

私を混乱させる何か: アカウントでログインすると、セッションが作成されます。その後、そのアカウントでログアウトし、別のアカウントでログインすると、セッションは他のアカウントと同じレコードに保存されます。セッション テーブルの新しいレコードはいつ作成されますか?

codeigniter のバージョン 2.1.3 を使用しています。

私は何を間違っていますか?

//Session config:

$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_expire_on_close'] = TRUE;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = TRUE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update']  = 300;
4

1 に答える 1

3

sess_expire_on_close設定したTRUEため、これは予期される動作であり、通常はほとんどの状況で必要になります。問題は、ブラウザを閉じて再度開くと、新しい Cookie (したがってセッション) が生成されることです。CIセッションクラスのドキュメントから(データベースへのセッションの保存について説明している下部に移動します):

注: Session クラスには、期限切れのセッションを消去する組み込みのガベージ コレクションがあるため、独自のルーチンを作成する必要はありません。

したがって、アドレス指定について心配する必要はありません。孤立したセッションは、セッション クラスによって DB から自動的にガベージ コレクションされます。必要に応じて、cron を介してクリーンアップするコードを実装できますが、実際にはその必要はありません。

現在、これが特定のログイン ユーザーに問題を引き起こしているが (たとえば、「remember me」) 他のすべてのユーザーに対してセッションを閉じると期限切れになるようにしたい場合は、セッション Cookie よりもはるかに長持ちし、相関する別の Cookie を手動で設定することで回避できます。セッションDB内のアイテム。これにより、ユーザーが誰であったかを把握し、セッションが魔法のように持続する必要がある場合はセッションを再構築できます。これについては、多少関連する質問への回答でもう少し説明があります。

于 2013-02-10T14:05:48.823 に答える