• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:セッションファイルの有効期限ですが、)

セッションファイルの有効期限と削除方法について

このQ&Aのポイント
  • セッションファイルの有効期限や削除方法について、デフォルト設定や変更方法、画面を閉じた場合の対策などを解説します。
  • session.gc_maxlifetimeとsession.gc_probabilityのデフォルト値は1440と1ですが、これでは古いセッションファイルがサーバに残り続ける可能性があります。
  • セッションファイルの削除は、session.gc_maxlifetimeで指定された秒数より古いセッションファイルを削除するガベージコレクションによって行われます。ただし、画面を閉じた場合など、セッションファイルが正常に削除されない場合もあります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

PHPのセッション管理ほどおざなりな物は無い気がします。 セッションファイルの破棄を行うのに関わる設定項目は大体以下の三つ。 session.gc_probability(デフォルトは1) session.gc_divisor(デフォルトは100) session.gc_maxlifetime(デフォルトは1440) PHPは1度スクリプトが呼ばれるごとに「セッション削除判定」とでも言うべき処理を行います。 設定されている「gc_probability/gc_divisor」の確率でセッションを削除するかしないかを決め、削除する事になったら現在時刻よりgc_maxlifetimeでした秒数分古いセッションファイルを全て削除するのです。 つまりデフォルトのまんまであれば、どこかの誰かが「~.php」のファイルにリクエストを掛けるたびに1/100の確率で、1440秒(=24分)以上前に更新されたセッションファイルを全て削除するのです。 ちなみに新しいセッションが作成されるのはその削除判定の一連の処理が終わった後だった筈なので、そのリクエストで新たに作成された最新のセッションは削除対象にならず残り続けると言う事です。(でなければ次のリクエストに引き継ぐべきセッションファイルが作った矢先に消されてしまいますゆえ) セッションを削除するタイミングですが、会員登録などを行いログイン状態をセッションで管理するタイプのサイトの場合だと、例えば5分ごとにsession_regenerate_id(TRUE)などでセッションIDを切り替え続け、最終更新日時が30分以上前のセッションファイルは全て消す、なんて運用が主かと思います。設定時間にバラつきはあるでしょうけども。 上記の例で具体的な実装をあげるなら、gc_maxlifetimeを1800、gc_probabilityとgc_divisorを100にして、スクリプト側に if ( $_SESSION['LAST_TIME'] < time() - ( 5 * 60 ) ) { session_regenerate_id( TRUE ); $_SESSION['LAST_TIME'] = time(); } みたいな処理を入れてあげるとか。 ご指摘の通り、サーバ側のセッションファイルさえ破棄してしまえばクライアントのセッションクッキーは残っていても別に問題ありません。 存在しないセッションクッキーでアクセスしても$_SESSIONには何も入らず、空配列になります。そんな時は「セッションが切れたので再ログインしてください」とかなんとか注意を入れてログインページに飛ばしてしまえば良いのです。 ちなみに、毎回session_regenerate_id( TRUE )を行うのはあまりお勧めできません。 例えば何らかの情報の登録画面で決定ボタンを2度押してしまった、なんてミスをすると同じリクエストが2回投げられる事になります。 この場合、1度目のリクエストでセッションIDが書き換わるのですが、2度目のリクエストはその書き換わる前のIDでアクセスを行っていますから結果的にセッションデータを見失い、1度目のリクエストで登録処理が実行されているにも拘らず画面に表示されるのは2度目のリクエスト結果なので、見た目的には登録が行われていない状態になってしまったりするのです。

dalianse
質問者

お礼

大変詳しいご回答ありがとうございました。 参考になりました。