PHPで設定したセッションタイムアウトが実施されず苦労したので、PHPのセッションタイムアウト設定方法について共有いたします。
今回の環境
- 利用したクラウドサービス
- Azure Virtual Machines
- OS
- Red Hat Enterprise Linux release 8.5
- ミドルウェア
- Apache 2.4.37
- PHP 7.4.30
PHPセッションタイムアウトの設定
「/etc/php.ini」より設定を行います。
以下の設定を変更します。
session.gc_probability = 1
session.gc_divisor = 1
session.gc_maxlifetime = 1440
設定項目の説明です。
上記設定で24分に1回1/1の確立(100%)でセッションを破棄する設定となります。
- session.gc_divisor
- セッション削除処理を実行する確率(分母)
- session.gc_maxlifetime
- セッション有効時間(秒)
- session.gc_probability
- セッション削除処理を実行する確率(分子)
セッションIDの保存場所
実際にセッションが削除されるか確認するため、セッションIDの保存場所の確認を行います。デフォルトでは「/var/lib/php/session」にセッションIDが保存されます。
セッション破棄のポイント
設定後、実際に24分間ブラウザを利用せず、セッションが破棄されるか確認を行いましたが、セッションが24分間を過ぎても一向に削除されず・・・
PHP公式マニュアルを確認したところ
session.gc_maxlifetime は、データが 'ごみ' とみなされ、消去されるまでの秒数を指定します。 ガベージコレクション (ごみの収集) は、 セッションの開始時に行われます (session.gc_probability と session.gc_divisor に依存します)。 デフォルトは 1440 (24分) です。
セッションの削除は24分経過後に削除されるわけではなく、24分経過後、次のセッション開始時にガベージコレクションより削除されるとのことでした。
動作確認ではブラウザを使用せず24分待機する手順としていましたが、別ブラウザで新たなに接続をする手順を加えて、古いセッションが削除されるか確認を行う手順へ変更を行いました。
上記手順で動作確認を行い無事、24分を過ぎた古いセッションが削除されるようになりました。
おわりに
今回はPHPのセッションタイムアウトについて解説しました。
設定を行うだけでなく、ロジックまで理解する必要があると感じました。
持田 明日翔(日本ビジネスシステムズ株式会社)
モダンワークプレイス部所属。仮想基盤構築やミドルウェア導入などを経験し、現在はAzure認証周り業務に携わっております。このブログではAzure関連に関する記事を中心に執筆していければと思っています。趣味は登山です。
担当記事一覧