PHP でセッションタイムアウトを変更するにはどうすればいいですか? 質問する

PHP でセッションタイムアウトを変更するにはどうすればいいですか? 質問する

PHPのセッションタイムアウトを延長したい

php.ini ファイルを変更することでそれが可能であることは知っています。しかし、私にはそのファイルへのアクセス権がありません。

では、PHP コードだけで実行することは可能ですか?

ベストアンサー1

セッションタイムアウトは、厳密な保証が必要な場合はコードで実装する必要がある概念です。唯一の方法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 は潜在的にコストのかかるプロセスであるため、通常、確率はかなり小さいか、ゼロです (膨大な数のアクセスがある Web サイトでは、確率的 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 が重要になる (可能性は低いですが) 場合は、session_regenerate_id必要に応じてセッション ID を再生成するように注意する必要があることに注意してください。

おすすめ記事