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が機能するかどうかの確認手順

  1. ブラウザAでログインする。
  2. 5分待つ。
  3. 新規にブラウザBを立ち上げてログインする。(確実にするなら別クライアントで操作した方がいいかも) ここでブラウザAのsessionの情報が破棄される。
  4. ブラウザAをリロードする。ここでログイン画面にリダイレクトされるとか、session timeoutの場合のエラーメッセージが表示されるとかになれば、正常にsession timeoutが機能していることになる。

1件のコメント

  • <a href=http://www.bagll.net/bo1.html

    弊店では信用第一主義を徹底しており社員全員下記の方針のもとに頑張っています。1.不適合品を入荷しない。厳しく受け入れ検査を行い、お客様に満足いただける品質のいい物だけを入荷する。2.不適合品を出荷しない。出荷前に細部まで二重確認を行い、お客様からご注文頂いた商品を納期通り出荷する。3.お客様からのクレームゼロお客様第一主義を徹底し、お客様からのお問い合わせ、苦情等に対して積極的かつ丁寧に対応いたします。}}}}}

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください