session.gc_maxlifetimeの設定だけでは不十分
よくありがちな30分間操作がなければセッションを無効にする、といった処理。
セッションの有効期限(session.gc_maxlifetime)を30分に設定するだけでいいんじゃない?と思っていました。
ini_set('session.gc_maxlifetime', 1800);
session.gc_maxlifetime は、データが 'ごみ' とみなされ、消去されるまでの秒数を指定します。 ガベージコレクション (ごみの収集) は、 セッションの開始時に行われます (session.gc_probability と session.gc_divisor に依存します)。
session.gc_divisorと session.gc_probabilityの組み合わせで すべてのセッションの初期化過程でgc(ガーベッジコネクション)プロセス も始動する確率を制御します。確率は gc_probability/gc_divisor で計算されます。例えば、1/100は各リクエスト毎に1%の確率でGCプロセスが 始動します。 session.gc_divisorのデフォルトは100です。
つまり、実際に削除(ガベージコレクション)が行われるのは次回のsession_start()時。かつ、デフォルトであれば1/100の確立。
また、この方法では有効時間が伸びない場合もあるようです。理由は後述。
毎回破棄したい場合
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);
PHPは、デフォルトで確率ベースのセッション GC を行います。
確率ベースの GC は多少は機能しますが、いくつかの問題があります。 1) トラフィックが少ないサイトのセッションデータは、優先期間内に削除されないことがあります。 2) トラフィックの多いサイトでは、GC が頻繁になる可能性があります。 3) ユーザーの要求の際に GC が実行され、ユーザーは GC 遅延を感じます。
ただこの方法だと上記の3)のように処理が重たくなることもあるようです。
自分でスクリプトを書いた方がいいかも。
有効時間が伸びない場合
注意: 異なる値を session.gc_maxlifetime に指定している 別々のスクリプトがセッションデータの保存場所を共有している場合、 一番小さい設定値に達した時点でデータが消去されます。このような場合には、 お互いに session.save_path を使用します。
複数のアプリケーションなどでセッションファイルの保存場所が同じ場合には、一番小さい設定値になってしまうようです。
この場合はsession.save_pathでセッションファイルの保存場所を変更する必要があります。
参考
セッションの有効期間とか設定とか挙動とかを調べました
[php]ログインセッションの維持・有効期間について (session,cookie)
PHP のセッションに関する覚え書き