Help us understand the problem. What is going on with this article?

[PHP]セッションの有効期限が切れてもセッションが消えるわけじゃない。

More than 1 year has passed since last update.

session.gc_maxlifetimeの設定だけでは不十分

よくありがちな30分間操作がなければセッションを無効にする、といった処理。
セッションの有効期限(session.gc_maxlifetime)を30分に設定するだけでいいんじゃない?と思っていました。

ini_set('session.gc_maxlifetime', 1800);

https://php.net/manual/ja/session.configuration.php#ini.session.gc-maxlifetime

session.gc_maxlifetime は、データが 'ごみ' とみなされ、消去されるまでの秒数を指定します。 ガベージコレクション (ごみの収集) は、 セッションの開始時に行われます (session.gc_probability と session.gc_divisor に依存します)。

https://www.php.net/manual/ja/session.configuration.php#ini.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);

https://www.php.net/manual/ja/function.session-gc.php

PHPは、デフォルトで確率ベースのセッション GC を行います。
確率ベースの GC は多少は機能しますが、いくつかの問題があります。 1) トラフィックが少ないサイトのセッションデータは、優先期間内に削除されないことがあります。 2) トラフィックの多いサイトでは、GC が頻繁になる可能性があります。 3) ユーザーの要求の際に GC が実行され、ユーザーは GC 遅延を感じます。

ただこの方法だと上記の3)のように処理が重たくなることもあるようです。
自分でスクリプトを書いた方がいいかも。

有効時間が伸びない場合

https://www.php.net/manual/ja/session.configuration.php#ini.session.gc-maxlifetime

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

複数のアプリケーションなどでセッションファイルの保存場所が同じ場合には、一番小さい設定値になってしまうようです。
この場合はsession.save_pathでセッションファイルの保存場所を変更する必要があります。

参考

セッションの有効期間とか設定とか挙動とかを調べました
[php]ログインセッションの維持・有効期間について (session,cookie)
PHP のセッションに関する覚え書き

tkek321
自分用のメモくらいに使おうかなと思ってます。 マサカリ募集。
yyphp
PHPerが毎週集まり、ざっくばらんに情報交換する雑談コミュニティ
https://yyphp.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away