ラボ > FuelPHP:基本情報関連、セッション

FuelPHPのセッションを使うときの下準備と豆知識

作成日: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が引数で使える。