読者です 読者をやめる 読者になる 読者になる

cakephp1.2 セッションの有効期限についてまとめ

cakephp

通常のphpの場合、php.iniの以下の設定が有効期限に影響する

session.cookie_lifetime = 0
session.gc_maxlifetime = 1440

cookie_lifetimeはクッキーの有効期限(秒)となる。これが86400とかだと、クッキーのexpiresが1日後となる。0の場合は、セッションクッキーとなり、ブラウザが閉じるまで有効となる。
gc_maxlifetimeは、サーバー側でクッキーを破棄するまでの時間(秒)となる。そのため、cookie_lifetimeをいくら長くしようとも、gc_maxlifetimeがそれよりも短いと意味がないため、通常はcookie_lifetimeとセットで同じ値を指定する必要がある。

注意する点として、有効期限が0(セッションクッキー)なのに、chromefirefoxだとブラウザを閉じてもクッキーが無効にならない。これはブラウザ側の設定に依存するため。chromeだと設定>コンテンツの設定>cookieの項目とかで設定が可能になるらしい(未確認)。IEsafariだとセッションクッキーであればブラウザを閉じるとクッキーが無効になる(確認済み)。

参考サイト
セッションの有効期限を設定する | Web Tips
Cookie の仕様とセキュリティ

cakephpでは、core.phpで有効期限を設定する。

<?php
Configure::write('Security.level', 'low');
Configure::write('Session.timeout', '180');

level=lowだと、クッキーの有効期限が25年に設定される。ただ、クッキーの有効期限は25年になるが、タイムアウトは180*300=54000(秒)ということになり、cakephp側で54000秒後にセッションを無効にする。(ここでもgc_maxlifetimeは合わせておく必要がある)

この辺の処理は、以下のソースを見ればわかる。

/cake/libs/session.php
/cake/libs/security.php

<?php
ini_set('session.cookie_lifetime', $this->cookieLifeTime);
・・
session_start();

上記のような感じで、php.iniではcookie_lifetime=0に設定されていても、cakephp側でsession_start実行する前にini_setで有効期限を上書きしている。アクセスする度にタイムアウトまでの時間を更新しているので、タイムアウトが15時間であれば、最後のアクセスから15時間が経過するとセッションが無効になることになる。

httpsの環境では以下が必ず実行されるので、httpsの場合でのみクッキーを使用する

<?php
ini_set('session.cookie_secure', 1);

参考サイト
セッションの有効期間(1/2) - shima111の日記
CakePHPのセッションの期限について | トリビアル・イシューズ


メモ
session_set_cookie_params()は、セッション系のini_setを簡単に記述する関数らしい。

参考サイト
設定ディレクティブの取得変更には ini_set か専用の関数か? - Sarabande.jp
SE奮闘記: 【PHP】セッションタイムアウトの時間を設定する

[PR]
FXで資産形成をするなら、SBIFXトレードがおすすめです。
http://s2fx.com/低予算(1000通貨)で比較 | FX比較 低予算から始めるFXランキング 初心者の外為入門