作成日:2017-11-15, 更新日:2019-03-19
コンフィグファイルの準備
「fuel/core/config/session.php」を「fuel/app/config/session.php」にコピペ。
コンフィグファイルの中身の修正
ひとまず確認して、必要な書き換える部分。
初期値 | コメント |
---|---|
'expire_on_close' => true, | if true, the session expires when the browser is closed (optional, default = false) ※true: ブラウザを閉じるとセッション終了 |
'expiration_time' => 7200, | session expiration time, <= 0 means 2 years! (optional, default = 2 hours) 有効期限(秒) |
'rotation_time' => 300, | session ID rotation time (optional, default = 300) Set to false to disable rotation セッションIDの更新タイミング |
あちこちにある「cookie_name」は基本、修正不要。
一つのサーバーに複数FuelPHPをのせる場合、変更しないとセッションが上書きされる(サイトAでログインしたらサイトBでログアウトされる・・・的な感じになる)
セッションをファイル保存
- driverの値変更
-
'driver' => 'file',
- 確認箇所
-
'file' => array( 'cookie_name' => 'fuelfid', 'path' => APPPATH.'/tmp', 'gc_probability' => 5 ),
「'path' => APPPATH.'/tmp',」が間違っていると下記のようなエラーがでる。
Fuel\Core\FuelException [ Error ]: You have specify a valid path to store the session data files. 〇〇〇/core/classes/session/file.php @ line 363
要は「指定されているけどそんなフォルダが無いよ」っていうエラー。
セッションをDBに保存
- driverの値変更
-
'driver' => 'db',
- 確認箇所
-
'db' => array( 'cookie_name' => 'fueldid', 'database' => null, 'table' => 'sessions', 'gc_probability' => 5, ),
- DBにテーブル追加(テーブル名の指定「'table' => 'sessions'」)
-
CREATE TABLE IF NOT EXISTS `sessions` ( `session_id` varchar(40) NOT NULL, `previous_id` varchar(40) NOT NULL, `user_agent` text NOT NULL, `ip_hash` char(32) NOT NULL DEFAULT '', `created` int(10) unsigned NOT NULL DEFAULT '0', `updated` int(10) unsigned NOT NULL DEFAULT '0', `payload` longtext NOT NULL, PRIMARY KEY (`session_id`), UNIQUE KEY `PREVIOUS` (`previous_id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8;
セッションをDBに保存したとき
基本、ファイルであろうがcookieであろうが同じとは思うけど・・・未調査。
・「config/session.php」の「expiration_time」で「sessions.session_id」が作り直される。
・「config/session.php」の「rotation_time」で「sessions.session_id」が更新される。
「sessions.session_id」の作成 | タイミングはアクセスがあったとき |
---|---|
「sessions.session_id」の破棄 | タイミングは「config/session.php」の「expiration_time」 |
「sessions.session_id」の更新 | タイミングはアクセス+「config/session.php」の「rotation_time」 |
「sessions.updated」が更新 | タイミングはアクセスがあったとき |
「sessions.session_id」の更新とは | 1.「session_id」を「previous_id」に保存し 2.「session_id」を変更する |
ログイン時(\Auth::login())のセッション関連
・「sessions.payload(シリアライズされている)」の「login_hash」
・「ユーザーテーブル.login_hash」
が紐づく感じ。
ログアウト時(\Auth::logout())すると「sessions.payload」の中の「login_hash」が消える。
セッションキー要素の取得
- セッションキー(DBの各カラム)の値の取得例
-
$session_id = \Session::key(); // 「$session_id = \Session::key('session_id');」 と同じ // 引数指定:updatedを取得させる $updated = \Session::key('updated');
※ip_hash、created、updated、user_agent、payloadが引数で使える。