猛省:PHPのセッション有効期限とGC

恥ずかしさのあまり、穴を掘ってでも穴に入りたい気分です。

PHPのセッションは、session.gc_maxlifetimeに従ってGCされますが、このsession.gc_maxlifetimeが適用される範囲がsession.save_pathだという事を見落としていました。session.gc_maxlifetimeを変える場合は知っていなければならない事ですが、どうやら勝手に勘違いして自分に都合の良い解釈をしてしまっていたようです。本当に恥ずかしいです。

注意: 異なる値を session.gc_maxlifetime に指定している 別々のスクリプトがセッションデータの保存場所を共有している場合、 一番小さい設定値に達した時点でデータが消去されます。このような場合には、 お互いに session.save_path を使用します。

注意: デフォルトのファイルに基づくセッションハンドラを使用している場 合、使用するファイルシステムは、アクセス時間(atime)を記録できる 必要があります。Windows FATはこれができないため、 FATファイルシステムまたはatimeの記録ができない他のファイルシス テムで問題を発生した場合は、セッションのガベージコレクト処理を 行う他の手段を用意する必要があります。 PHP4.2.3以降、atimeの代わりにmtime(更新時刻)が使用されます。 このため、atimeが利用できないファイルシステムでの問題は無くなりました。
PHP: セッション処理関数(session) - Manual

php.netのセッションに関するドキュメントに(日本語で)ちゃんと書いてあります。セッションのGCはmtimeとsession.gc_maxlifetimeを利用して、有効期限切れのセッションファイルを回収するわけです。セッションデータにメタデータとして有効期限が格納されるなんて事は無いわけです。あっても、それはデフォルトのハンドラでは無いわけです。

つまり、session.save_pathを同じにしたままsession.gc_maxlifetimeが異なるスクリプトを動かしていたせいで、より短い方の有効期限でセッションが破棄されてしまっていました。

はぁ。いつになったら、胸を張って「技術者です」と言えるようになるのでしょうか。。。

プロフィール

このブログ記事について

このページは、koshigoeが2007年8月15日 23:15に書いたブログ記事です。

ひとつ前のブログ記事は「HTTP_Request 1.4.1はdeflateをデコードしないようだ」です。

次のブログ記事は「りんご臭」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。