php.ini サーバー設定がどのようにセッションを期限切れにするかについて、適切な回答を探すのに時間を費やしました。多くの情報を見つけましたが、設定がそのように機能する理由を理解するのに時間がかかりました. あなたが私のような人なら、これはあなたに役立つかもしれません:
セッションは Cookie (クライアントの PC 上のファイル) として保存されるか、サーバー側のファイルとしてサーバー上に保存されます。どちらの方法にも長所と短所があります。
サーバーに保存されたセッションには、3 つの変数が使用されます。
session.gc_probability session.gc_divisor session.gc_maxlifetime
(session.gc_probability/session.gc_divisor) は、ガベージ コレクション ルーチンが実行される確率を生成します。ガベージ コレクターが実行されると、少なくとも session.gc_maxlifetime の間アクセスされていないセッション ファイルがチェックされ、それらが削除されます。
これはすべてフォーラムの投稿でかなりよく説明されています (これは特に!) - しかし、次の質問が出てきます:
1.) その確率はどのように適用されますか? サーバーがサイコロを振るのはいつですか?
A: サーバー上のアクティブなセッション中に session_start() が呼び出されるたびに、サーバーはサイコロを振ります。これは、session.gc_probability = 1 および session.gc_divisor = 100 のデフォルトを使用している場合、session_start() が呼び出される 100 回ごとにガベージ コレクターが実行されることを意味します。
2.) ボリュームの少ないサーバーではどうなりますか?
A: session_start() が呼び出されると、最初にセッションが更新され、セッションの値が利用できるようになります。これにより、サーバー上のセッション ファイルの時刻が更新されます。その後、サイコロを振って、勝った場合 (100 分の 1 の確率)、ガベージ コレクターを呼び出します。次に、ガベージ コレクターはすべてのセッション ID ファイルをチェックし、削除できるファイルがあるかどうかを確認します。
つまり、サーバー上にあなたが 1 人しかいない場合、セッションが非アクティブになることはなく、設定を変更しても効果がないように見えます。session.gc_maxlifetime を 10 に変更し、session.gc_probability を 100 に変更したとします。これは、100% の確率でガベージ コレクターが実行され、過去 10 秒間アクセスされていないセッション ファイルがすべて消去されることを意味します。
サーバー上に自分しかいない場合、セッションは削除されません。あなたのセッションが非アクティブになるには、他のアクティブなセッションが少なくとも 1 つ実行されている必要があります。
したがって、基本的に、低ボリュームのサーバーまたは低ボリュームの時間では、ガベージ コレクターが実際に実行されてセッションが実際に削除されるまでに、session.gc_maxlifetime よりもはるかに長くなる可能性があります。そして、これがどのように機能するかを知らなければ、完全にランダムに見えるかもしれません.
3.) なぜ彼らは確率を使うのですか?
パフォーマンス。大容量のサーバーでは、session_start() のすべてのリクエストでガベージ コレクターを実行したくありません。サーバーを不必要に遅くします。そのため、サーバーのボリュームに応じて、ガベージ コレクターが実行される確率を増減させたい場合があります。
これがあなたのために物事を結びつけることを願っています。あなたが私のようで、session.gc_maxlifetime を試してみてうまくいかなかった場合 (誰の邪魔にもならないように開発サーバーで試したために)、この投稿で頭を悩ませずに済んだことを願っています。
幸運を!