1. ホーム
  2. php

[解決済み] PHPでセッションタイムアウトを変更する方法は?

2022-04-23 18:39:18

質問

phpでセッションのタイムアウトを延長したいのですが。

php.iniファイルを修正することで可能なことは知っています。 しかし、私はそれにアクセスすることができません。

ということは、phpのコードだけで可能なのでしょうか?

どのように解決するのですか?

セッションタイムアウトは、厳密な保証を望むなら、コードで実装されなければならない概念です。 唯一の方法 を使えば、どのセッションもX分後には生き残れないということを、絶対に確認することができます。

この要件を少し緩和しても構わない、そして 下限 期間に対する厳密な制限の代わりに、カスタムロジックを書くことなく、簡単に実行できます。

リラックスした環境での利便性:方法と理由

もし セッションがクッキーで実装され(おそらくそうでしょう)、かつ もし クライアントが悪意を持っていない場合、特定のパラメータを調整することで、セッション時間の上限を設定することができます。PHP のデフォルトのセッション処理でクッキーを使用している場合、セッションの持続時間を設定するために session.gc_maxlifetime とともに session_set_cookie_params は、このように動作するはずです。

// server should keep session data for AT LEAST 1 hour
ini_set('session.gc_maxlifetime', 3600);

// each client should remember their session id for EXACTLY 1 hour
session_set_cookie_params(3600);

session_start(); // ready to go!

これは、サーバーが少なくとも1時間以上操作されないとセッションデータを保持するように設定し、クライアントには同じ時間が経過したらセッションIDを忘れるように指示することで機能します。 期待される結果を得るためには、これらの両方の手順が必要です。

  • もしあなたがクライアントに1時間後にセッションIDを忘れるように指示しなければ(あるいはクライアントが悪意を持ってあなたの指示を無視することを選んだ場合)、彼らは同じセッションIDを使い続け、その有効期間は非決定的となります。これは、サーバー側で寿命が切れたセッションはすぐにガベージコレクションされるわけではなく、あくまで セッションGCが起動するたびに .

    GCは潜在的に高価なプロセスなので、一般的に確率はむしろ小さいかゼロです(膨大な数のヒットを得るウェブサイトは、おそらく完全に確率的なGCを放棄し、X分ごとにバックグラウンドで起こるようにスケジュールします)。どちらの場合も(非協力的なクライアントを仮定して)、有効なセッション寿命の下限は次のようになります。 session.gc_maxlifetime しかし、その上限は予測不可能です。

  • を設定しない場合 session.gc_maxlifetime この場合、まだセッション ID を覚えているクライアントはそれを表示しますが、サーバーはそのセッションに関連するデータを見つけられず、あたかもセッションが開始されたばかりであるかのように動作します。

クリティカルな環境における確実性

カスタムロジックで 上限 を設定することで、厳密な設定が可能になります。

残りのセッションデータと一緒に上限値を保存することで、これを実行します。

session_start(); // ready to go!

$now = time();
if (isset($_SESSION['discard_after']) && $now > $_SESSION['discard_after']) {
    // this session has worn out its welcome; kill it and start a brand new one
    session_unset();
    session_destroy();
    session_start();
}

// either new or old, it should live at most for another hour
$_SESSION['discard_after'] = $now + 3600;

セッション ID の永続化

これまでのところ、各セッションIDの正確な値には全く関心がなく、必要な限りデータが存在することだけが要件でした。セッション ID が重要であるという (ありそうもない) ケースでは、セッション ID の再生成に注意が必要です。 session_regenerate_id が必要です。