PHPでセッションが切れずタイムアウトしない

PHPのプログラム(5.3以上)で、セッションタイムアウトしない場合の解決方法のお話です。

php_logo.png

基本的には、php.ini(またはini_set())で、

session.gc_maxlifetime
session.gc_probability
session.gc_divisor

の3つを調整すれば、セッションタイムアウトをコントロールできます。
極端な例として、「30秒で確実にタイムアウトさせる」には、

session.gc_maxlifetime = 30
session.gc_probability = 1
session.gc_divisor = 1

とすればよいのですが、この設定を行い、apacheの再起動をしても、セッションが切れないケースがあります。
それは、

セッションファイルの保存先がサブディレクトリ指定になっている

ケースで、例えば、

session.save_path = "/var/lib/php5"

のようになっている場合です。
このような場合、ガベージコレクションが自動的には機能しないと、
php.ini内に注意書きとして書かれています。

; NOTE: If you are using the subdirectory option for storing session files
; (see session.save_path above), then garbage collection does *not*
; happen automatically. You will need to do your own garbage
; collection through a shell script, cron entry, or some other method.
; For example, the following script would is the equivalent of
; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):
; find /path/to/sessions -cmin +24 -type f | xargs rm

解決方法としては、

1.session.save_path = "/tmpphp5" のようにサブディレクトリではない指定にする。
2.cronで消す。(例:find /path/to/sessions -cmin +24 -type f | xargs rm)

のどちらかになります。

セッションタイムアウトが思うように発生してくれないとお悩みの方はご参考にどうぞ。

ぐっどらっこ。