sessionのタイムアウトについて。
sessionの有効時間を長めにとりたくて
一生懸命
config/core.php
の『CAKE_SESSION_TIMEOUT』の設定を変更してた。
設定はこんなかんじ↓
define('CAKE_SECURITY', 'high');
define('CAKE_SESSION_TIMEOUT', '1080');
こうすると、実際のセッション有効時間は
1080*10(highの場合は10なので。)=10800秒=3時間
だけどセッションが3時間持ったためしがない。。
ずっと解らなくて、php.iniの設定見て
あれれ?と思ってcakeのファイルでgrepかけたところ
ようやく原因が判明!!
↑で設定しているセッション時間は
「設定した時間が過ぎたら、新しいセッション吐き出しなおすよ♪」
という設定。
でも、セッションにはもう1つ
「設定した時間が過ぎたら、一定確率でサーバ側のセッション削除するよ♪」
という設定がある。
私は↑の設定が、後者の設定だとずっと思い込んでた。。
つまり、
「もしsessionが3時間以上経ってからアクセスしたら
新しいsession吐き出すぞー♪」
「え?3時間も経つ前に、一定確率でsession削除しちゃうよ?」
という状況に陥ってた。。。
後者の削除時間設定はphp.iniの『session.gc_maxlifetime』で設定する。
一定確率、というのも、php.ini内の
『session.gc_probability』/『session.gc_divisor』ってなってる。
php.iniの設定がデフォルトなら
こんなかんじ↓
session.gc_probability = 1
session.gc_divisor = 100
session.gc_maxlifetime = 1440
これだと、
「1440秒(24分)より前に更新されているsessionは
他のsessionが更新された時に、1/100の確立で削除するよ♪」
というカタチ。
直接php.iniの設定を変更すると、全プログラムに関わっちゃうので
configの設定ファイル内で
ini_set('session.gc_maxlifetime', 10800);
を追記。
検証の時は、1/100の確立を待ってるのが面倒だから
ini_set('session.gc_divisor', 1);
も追記して、
3時間過ぎたら他session更新時100%の確立で削除。
これで、
「もしsessionが3時間以上経ってからアクセスしたら
新しいsession吐き出すぞー♪」
「3時間経ってたら、アクセス前に一定確率でsession削除するかもね☆彡」
という感じに変わった〜♪
いろいろググってた時
sessionが何故か残ってる!!という人は多かったけど
sessionが消えちゃう!!っていう人全然いなかったんだよね。。
原因不明のまま諦めようかと思ってたけど
自分で気がつけて良かったぁ(*>ω<)o
♪ ♪ ♪ 追記@09/01/23 ♪ ♪ ♪
session.gc_maxlifetime の設定だけでは不十分でした(>▽<;
さらに、session_save_pathの指定も消えない為の設定です。
session_save_path("/tmp/hoge");