PHP のセッションタイムアウト: ベストプラクティス 質問する

PHP のセッションタイムアウト: ベストプラクティス 質問する

session.gc_maxlifetimeとの実際の違いは何ですかsession_cache_expire()?

15 分間何も操作が行われなかった場合 (最初に開かれてから 15 分後ではなく)、ユーザー セッションを無効にしたいとします。この場合、次のどれが役立ちますか?

また、ユーザーの Cookie を一定時間で期限切れにするように設定できることもわかっていますsession_set_cookie_params()。ただし、Cookie の有効期限とサーバー側での実際のセッションの有効期限は同じではありません。これにより、Cookie の有効期限が切れるとセッションも削除されますか?

私が考えた別の解決策は$_SESSION['last_time'] = time()、リクエストごとにセッションを現在の時刻と比較し、それに基づいてセッションを削除するという単純なものです。ただし、これを処理するためのより「組み込み」のメカニズムがあることを期待していました。

ありがとう。

ベストアンサー1

php.ini サーバー設定によってセッションが期限切れになる仕組みについて、良い答えを探すのに時間がかかりました。多くの情報を見つけましたが、設定がなぜそのように機能するのかを理解するのに時間がかかりました。私と同じなら、これが役に立つかもしれません:

セッションは、Cookie (クライアントの PC 上のファイル) として保存されるか、サーバー側ではサーバー上のファイルとして保存されます。どちらの方法にも、長所と短所があります。

サーバーに保存されるセッションには、3 つの変数が使用されます。

session.gc_probability セッション.gc_divisor セッション.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 回ごとに約 1 回実行されることになります。

2.) 低ボリュームのサーバーでは何が起こりますか?

A: session_start() が呼び出されると、まずセッションが更新され、セッション値が利用できるようになります。これにより、サーバー上のセッション ファイルの時刻が更新されます。次にサイコロを振り、勝った場合 (100 分の 1 の確率)、ガベージ コレクターを呼び出します。次に、ガベージ コレクターはすべてのセッション ID ファイルをチェックし、削除可能なものがあるかどうかを確認します。

つまり、サーバー上にあなたが 1 人しかいない場合は、セッションが非アクティブになることはなく、設定を変更しても効果がないように見えます。たとえば、session.gc_maxlifetime を 10 に、session.gc_probability を 100 に変更するとします。これは、ガベージ コレクターが実行される可能性が 100% あり、過去 10 秒間にアクセスされていないセッション ファイルがすべてクリアされることを意味します。

サーバー上にあなたが 1 人しかいない場合は、セッションは削除されません。セッションを非アクティブにするには、少なくとも 1 つの他のアクティブなセッションが実行されている必要があります。

つまり、基本的に、低ボリュームのサーバーまたは低ボリュームの時間では、ガベージ コレクターが実際に実行され、セッションが実際に削除されるまでに、session.gc_maxlifetime よりもはるかに長くなる可能性があります。これがどのように機能するかを知らなければ、完全にランダムに見えるかもしれません。

3.) なぜ確率を使用するのでしょうか?

A: パフォーマンス。ボリュームが大きいサーバーでは、session_start() のリクエストごとにガベージ コレクターを実行する必要はありません。サーバーが不必要に遅くなります。そのため、サーバーのボリュームに応じて、ガベージ コレクターが実行される確率を増減する必要があります。

これで皆さんの理解が深まったと思います。もし皆さんが私と同じように、session.gc_maxlifetime を試したけれどうまくいかなかった (誰にも迷惑をかけないように開発サーバーで試したため) のであれば、この投稿が皆さんの頭を悩ませる問題を解消してくれることを願っています。

幸運を!

おすすめ記事