Posted at

PHPでセッションの長さを変更する

セッションの長さを確認する機会があったけど、どういう仕組みで削除されるのかもわかっていなかったのでまとめました。

PHPでのセッションの使い方については基本的な使用法に記載されています。


PHPのセッションの保持期間

調べるとデフォルトでは下記のようです。

このデフォルト値がphp.iniに定義されており、こちらを変更することでセッションの保持期間を変更できます。


デフォルトでは、1/100の確率で、24分より古いセッションファイルが消えます。


24分よりも古くなったら自動的に削除される訳ではなく、1/100の確率でGC(ガーベッジコレクション)が動き削除を行うようです。

また、この24分の間に再度リクエストがあった場合には、有効期限は更新されます。

参考

セッションの有効期間とか設定とか挙動とかを調べました


デフォルト値の確認

念の為デフォルト値になっているかの確認を行います。php.iniの場所に関しては下記のコマンドでわかるはず。

$ php --ini | grep php.ini

Configuration File (php.ini) Path: /etc
Loaded Configuration File: /etc/php.ini

確認すべき項目は4つです。


session.gc_maxlifetime

サーバに保存されているセッションファイルの保存期間です。


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


$ grep "session.gc_maxlifetime" /etc/php.ini

session.gc_maxlifetime = 1440
; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes):


session.cookie_lifetime

ブラウザのクッキーの有効期間です。先ほどの session.gc_maxlifetime のみ変更をしても、デフォルトだとブラウザを閉じたらセッションが破棄されます。


session.cookie_lifetime は、 ブラウザに送信するクッキーの有効期間を秒単位で指定します。 0 を指定すると "ブラウザを閉じるまで" という意味になります。 デフォルトは、0 です。


$ grep "session.cookie_lifetime" /etc/php.ini

session.cookie_lifetime = 0


session.gc_probability

「1/100」の1の部分ですね。基本的にこちらは変更しなくて良いでしょう。


session.gc_probabilityと session.gc_divisorの組み合わせでgc (ガーベッジコレクション)ルーチンの始動を制御します。 デフォルトは、1 です。


$ grep "session.gc_probability" /etc/php.ini

; gc_probability/gc_divisor. Where session.gc_probability is the numerator
session.gc_probability = 1
; gc_probability/gc_divisor. Where session.gc_probability is the numerator and


session.gc_divisor

「1/100」の100の部分ですね。こちら確認をしたら調べた環境では1000になってました。そのため、各リクエスト毎に0.1%の確率でGCプロセスが始動する状態です。


session.gc_divisorと session.gc_probabilityの組み合わせで すべてのセッションの初期化過程でgc(ガーベッジコネクション)プロセス も始動する確率を制御します。確率は gc_probability/gc_divisor で計算されます。例えば、1/100は各リクエスト毎に1%の確率でGCプロセスが 始動します。 session.gc_divisorのデフォルトは100です。


$ grep "session.gc_divisor" /etc/php.ini

; session.gc_divisor
; when the session.gc_divisor value is 100 will give you approximately a 1% chance
; session.gc_divisor is the denominator in the equation. Setting this value to 1
; when the session.gc_divisor value is 100 will give you approximately a 1% chance
session.gc_divisor = 1000


変更を行う

検証でひとまず3日ぐらいセッションが保存されるように変更をしてみます。(日数は適当です)

クッキーの有効期限とセッションファイルの保存期間

ansibleなどを使用している場合には直接変更しちゃダメですが、そうでない人はひとまずバックアップとしてコピーしておきましょう。

$ sudo cp -pi /etc/php.ini /etc/php.ini.20190117

$ sudo vim /etc/php.ini
$ diff /etc/php.ini /etc/php.ini.20190117
1385c1385
< session.cookie_lifetime = 259200
---
> session.cookie_lifetime = 0
1432c1432
< session.gc_maxlifetime = 259200
---
> session.gc_maxlifetime = 1440
$ sudo service httpd graceful