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 だととりあえず今も残ってる。

php.session.gc

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