CakePHPのセッションの期限について

LINEで送る
Pocket

CakePHPでセッション期限を設定する

セッションが切断される機構にはいくつかの要素が絡んでいるので、一つのパラメータを操作しても思った様に動作しない場合がある。

【設定要素】

yourpath/app/config/core.php

・Configure::write('Session.timeout', '2016');
・Configure::write('Security.level', 'low');

/etc/php.ini

・session.gc_probability = 1
・session.gc_divisor = 1000
・session.gc_maxlifetime = 1440 ←単位は秒

【設定要素の説明】

Session.timeout

Session用のCookieをブラウザに保持しておく期間を設定。
単位は秒だが、Security.level の値による係数がかかる。
Cookieは更新されないので、この期間がそのままセッション保持の期間となる。

Security.level
ここでは、セッションの秒数にかかる係数値のみ述べるが、実際にはlevelによって様々な事が変わってくるので注意。
high:       x 10
medium: x 100
low:        x 300

例として、timeout = 2016, level = low の場合以下となる。
2,016s x 300 = 6,048,000s = 7 days となる。

session.gc_probability と session.gc_divisor
サーバー側でガベージコレクションを実施する確率を設定。
ユーザーによるアクセスの度にガベージコレクションが行われるのは負荷が高いので、実施する確率を設定している。
session.gc_probability = 1, session.gc_divisor = 1000 の場合 1/1000 の確率でガベージコレクションが行われる。
例えば1分間に1000PV程度のサイトであればだいたい毎分gcが行われている事になる。

session.gc_maxlifetime
Sessionファイル(*) をサーバーに保持しておく期間を設定。
ただし、Sessionファイルの最終更新日時は同一セッションからのアクセスがある度に更新される。
maxlifetimeは最終更新日時からの経過時間を指定しているものなので、頻繁にアクセスするセッションは維持されやすい。

PHP側でgc_maxlifetimeを設定する場合

ini_set("session.gc_maxlifetime", $time);

をsession_startより前に書く。

*:core.phpの設定により、ファイルではなくDBやmemcacheの場合もある。

【セッション維持とタイムアウトの仕組み 】

管理されるファイル

・ブラウザ側のセッション用Cookie
・サーバー側のSessionファイル(ファイルとは限らない)

フロー

  1. ユーザーのアクセスにより、CookieとSessionファイル(*)が作成される。
  2. Cookieは作成された時を基準にして core.phpに記載した Session.timeout の時間だけ保持される。
  3. Sessionファイルは最終アクセス日時を基準にして、php.iniの gc_maxlifetime の時間だけ保持される。
  4. gc_probability / gc_divisor の確率でガベージコレクションが発生し、その際に期限切れSessionファイルは削除される。
  5. ガベージコレクションで削除されずに残ったセッションもCookieのtimeoutにより最終的に削除される。

 

LINEで送る
Pocket