PHP4 のセッション機能なんだが, こいつはデフォルトでは /tmp にセッション情報ファイルを作る 「session/mod_file」を使うのだなー.
で,PHP のセッション管理には「ガベッジコレクション」という概念があって, これは,「ログアウト」という行為が保証されない HTTP でのセッション機能として, クローズされなかったセッションを一定時間後に勝手に閉じるのに必要な機能だ. こいつは,セッション情報書込みのタイミングで, 指定した確率で発生し,その時点で「賞味期限切れ」のセッションをクローズする. file ハンドラであれば,/tmp にあるセッション情報を削除してまわる.
で...この「賞味期限切れ」の判定ってのが, 「最後のアクセスから一定時間触られていないもの」で, さらにこの「一定時間」つーのは, 「定義ファイル(php.ini あるいは .htaccess)で定義された時間」となる.
この「定義された時間」つーのが曲者で, サイトごとに設定できる値なのだけど,/tmp は指定しない限り共用で使うわけで, よくよくソースを読んでみると,この「サイトごと」ってのは考慮されていないようだ.
つまり,サイト A で期限 24h で設定したセッションは, 期限 2h であるサイト B のガベッジコレクション時に消されてしまう恐れがあるわけ. うひー.これはよろしくない仕様ですヨ!?
じゃ,/tmp を使わないように分ければいいんだけど, いったいどういう理由からか, 「階層が 2階層目より下のディレクトリを使う場合, 自動ガベッジコレクションは行なわれない」という制限がある! まぁ /tmp の代わりに /a でも /b でも使えばいいんだろうけど... なんかこー,/ にこういうディレクトリを作るのには抵抗感が...
ってことで,oracle のデータベースを使うセッションハンドラを自作することにする. PHP のマニュアルと, 検索して見つけた「なんか適当なサイト」 を参考に作ってみるよー.
oracle というより,汎用化して, PEAR DB であれば大体何でも使えるようにしてみようかな. セッションのたびに PEAR 接続するのは遅そうだけど, まぁ 1 リクエストあたり 1~2 回しか呼ばれねーわけで, 大したコストじゃないや.きっと.