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';
}
?>
session test
/var/tmp とか /tmp に保存すると指定時間後に破棄されたけど、/var/lib/php5 だととりあえず今も残ってる。

どうにかならないのかなこれ。
深さはよくわかんないけどDebianだとcronで削除する処理があるはず。
まあPHPが自前で消せよなって思うね。
まぁどういうつもりかわかんないけど、たぶんパッケージ作った人的には
・pathの美しさが重要なんだよこのうんこ野郎!
・gcなんてOSに任せとけよこのうんこ野郎!
・不満があるならphp.ini書き変えろよこのうんこ野郎!
という勢いなんじゃないかな。
だからうんこ垂れ流しでおkみたいな設定なんじゃないかなぁ。
ちなみに、手動でやる部分は、session_regenerate_id(true)って引数指定すれば明示的に古いセッションを破棄できる。
http://jp.php.net/session_regenerate_id
だから、この引数省略しちゃヽ(´Д`ヽ)(/´Д`)/イヤァァァ~
あと再生成せず破棄「だけ」をしたいならsession_destroyってのもあるよ。
まぁ、知ってるだろうけど一応。
まで書く前に投稿したうんこ以下な俺ガイルorz
ノートPC危険ぬヽ(T△T)ノ