PHPのsessionの有効期限
phpのアプリケーションで、「30分経ってもsession timeoutにならないみたい」という話が出た。
; Define the probability that the ‘garbage collection’ process is started
; on every session initialization.
; The probability is calculated by using gc_probability/gc_divisor,
; e.g. 1/100 means there is a 1% chance that the GC process starts
; on each request.
session.gc_probability = 1
session.gc_divisor = 100
; After this number of seconds, stored data will be seen as ‘garbage’ and
; cleaned up by the garbage collection process.
session.gc_maxlifetime = 1440
上記のようにデフォルトだと、100分の1の確率でGCルーチンが起動され、最終更新から1440秒を経過したセッションファイルを削除する。
ということになります。
つまり、session.gc_probabilityが分子、session.gc_divisorが分母となる。
session.gc_maxlifetimeで、最終更新から何秒たてば「ゴミ」とみなすか、指定。
http://php.goinkyo.be/?clt=general&doc=phpini:title=こりゃまたphp.iniの設定
テスト機の/etc/php.iniを見ると下のような設定になってた。
session.gc_probability = 1 session.gc_divisor = 1000 session.gc_maxlifetime = 1440
sessionの初期化処理が実行される時、1/1000の確率で24分(1440秒)以上アクセスされないsession情報を破棄されるということか。
だから、デフォルトのphp.iniの設定の場合なら、1人か2人しかアクセスしていないようなテスト機では、いつまで経ってもsession timeout が発生しなくても普通の話ってことですね。
timeoutの確認をしたい場合は、/etc/php.iniを以下のように変更して、5分(300秒)後に、別sessionで同じアプリにアクセスしてからタイムアウトしてるかどうかを確認すればいいということになる。
session.gc_probability = 1 session.gc_divisor = 1 session.gc_maxlifetime = 300
上の設定に変更した場合のsession timeoutが機能するかどうかの確認手順
- ブラウザAでログインする。
- 5分待つ。
- 新規にブラウザBを立ち上げてログインする。(確実にするなら別クライアントで操作した方がいいかも) ここでブラウザAのsessionの情報が破棄される。
- ブラウザAをリロードする。ここでログイン画面にリダイレクトされるとか、session timeoutの場合のエラーメッセージが表示されるとかになれば、正常にsession timeoutが機能していることになる。
<a href=http://www.bagll.net/bo1.html