PHPのセッションのガーベジコレクションがよくわからない
Comments: 3 - Date: October 25th, 2008 - Categories: PHP
PHPマニュアルに以下のようにあるんだけど、
http://jp.php.net/manual/ja/session.configuration.php#ini.session.save-path
オプションの引数としてN(数値)を指定できます。 これはセッションファイルを分散して保存する際に ディレクトリ階層レベルを決定します。 例えば、'5;/tmp'とすると /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If という位置にセッションファイルを生成します。 Nを使用するには、これらすべてのディレクトリが 事前に作成されている必要があります。 そのためのシェルスクリプトがext/sessionに mod_files.shというファイル名であります。 また、0以上のNが指定されている場合には自動ガーベッジコレクション が機能しないことに注意してください。詳細は php.ini を見てください。 また、Nを指定する場合は、 session.save_pathを"quotes"で囲う必要があります。 なぜならセパレータ(;) は php.ini ではコメントとしても利用されているからです。
これがちょっとまえのマニュアルだと、
http://www.teu.ac.jp/chiit/~dsuzuki/phpdoc/ref.session.html
session.save_pathのパスの深さが2より大きい場合、ガーベッジコレクションは行われません。
となっているぽい。
debianのパッケージから入れたphpでは、デフォルトのセッション保存先は /var/lib/php5 になってる。
これが「パスの深さが2より大きい場合」にあたるのか、自分が試した限りではセッションが破棄されなかった。
< ?php ini_set('session.gc_maxlifetime', 3); ini_set('session.gc_probability', 1); ini_set('session.gc_divisor', 1); session_cache_expire(1); session_start(); session_regenerate_id(); if (isset($_SESSION['user'])) { $_SESSION['count'] += 1; echo 'login', $_SESSION['count']; } else { $_SESSION['user'] = true; echo 'logout'; } ?> <a href="test.php">session test</a>
/var/tmp とか /tmp に保存すると指定時間後に破棄されたけど、/var/lib/php5 だととりあえず今も残ってる。

どうにかならないのかなこれ。
