実現したいこと
各画面を通過した際に$_SESSION["vaild_session"]という変数を定義し、TOP画面から入力画面を開いた際にisset($_SESSION["valid_session"])でセッションが有効がどうかを検証し、切れている場合はTOP画面に戻るという処理を実装しようと考えています。
実現させたいことの背景
毎週、週の活動内容を報告するシステムを運用しています。
画面の構成として
ログイン画面
- ログインを行う
TOP画面
- 「1月 第1週」「1月 第2週」のような入力画面へ入るためのリンクや更新時刻を含む行が縦に並んでおり、文字をクリックするとその週の活動内容を入力するフォームへ移動する
- 毎週月曜日6:00に今週の分のリンクの行が追加される
- 新たな週が追加されるとそれ以前の週については活動内容の入力は行えなくなり、リンクをクリックすると過去の報告内容を確認することができる
- 時間経過による変化はページのリフレッシュを行わなければ反映されない
入力画面
- 週のリンクをクリックすることで開くページ
- 活動内容を入力することができる
- 入力についてはその週の間であれば何度でも入力することができ、その都度更新される
詳細画面
- 過去の報告の内容を確認できる
- 入力期限の過ぎた週のリンクからは入力画面ではなく、この画面に遷移する
TOP画面を開いたままの状態でページを1週間以上放置してしまうと、その画面から本来入力できないはずの1週前の報告が行えてしまうという不具合が発覚したためそれを修正する必要があるという状況です。
質問用にシステムの内容を若干改変しているため、齟齬があった場合はご容赦ください。
発生している問題・分からないこと
セッションの有効期限を session.gc_maxlifetime によって設定していますが gc の仕様上設定した期間を過ぎても確実にセッションが切れるわけではなく、session.gc_probability 1 / session.gc_divisor 1 と設定すると処理が明らかに重くなる上にそれでも期限を過ぎてセッションが生きている場合があり、困っています。
わからないこととしては以下の通りです
- 今回のケースの場合、maxlifetimeの設定期間はどのくらいが適切か、それを決定する際にどのような指標があるか
- なぜprobabilityとdivisorの設定を行ってもセッションが切れたり切れなかったりするのか
- probabilityとdivisorの設定を行うと全体的に処理が重くなってしまうため、何か他に良い方法はないか模索しているがそれが見つからない
- セッションによる管理以外にもっといい方法があるか、現在行っている方法は遠回りではないか
該当のソースコード
php
12if(!isset($_SESSION["vaild_session"])){3 $_SESSION["session_over"] = true; #TOP画面に戻った際にポップアップを開くためのフラグ4 require_once './top.php';5 exit;6}7 8//同様の記述を各画面で行う9$_SESSION["vaild_session"] = true;10 11//入力ページの処理
ini
1#デバッグ用に極端に短くしていますが、基本は86400で設定しています。2php_value session.gc_maxlifetime 10 3php_value session.gc_probability 1 4php_value session.gc_divisor 1
試したこと・調べたこと
上記の詳細・結果
セッションが始まった時間を明確に記録し、そこから任意の期間が経過した場合にunset($_SESSION["valid_session"])を行うような処理を記述できないか調べましたが、方法が悪かったのか有意な結果が得られませんでした。
補足
phpバージョン 8.3
フレームワーク等は未使用です。
不明な点や説明の不足等あればコメントで指摘していただければ幸いです。
0 コメント