10

シナリオ:

  • ユーザーのログイン
  • Cookie はセッションの長さに設定されます
  • 非アクティブ状態が 1 時間続いた後、ユーザーをログアウトしたい

これを解決できると思う方法:

  • session.gc_maxlifetime を 1 時間 (3600) に設定します。
  • session.gc_probability を 1 に設定します
  • session.gc_divisor を 1 に設定します
  • したがって、1 時間後にアイドル状態のセッション Cookie でガベージ コレクションが発生することは 100% 確実です。

私の質問:

私が読んだすべての投稿とドキュメントでは、gc の変更を 100% に設定することについて言及していません。したがって、これを行うのは悪いことですか? より良い方法はありますか?

これは symfony アプリであり、長期的にはhttp://symfony.com/doc/master/components/http_foundation/session_configuration.html#session-meta-dataのようなことをしたいと思っていますが、今のところ私はただやりたいと思っていましたsession.gc_* を使った簡単なもの

私が読んだある投稿は、ガベージ コレクションの可能性が 100% であることは「コストがかかる」ことを暗示しています。30 分後に PHP セッションを期限切れにするにはどうすればよいですか? これは本当ですか?もしそうなら、どのくらいの費用がかかりますか?

乾杯!

4

2 に答える 2

7

gc_probabilityとはgc_divisor、ガベージ コレクション (GC) を起動する "確率" を定義できるようにするためにあります。

GC (すべてのものとして) にはコストがかかるため、通常、サーバーによって処理されるすべての Web リクエストに対して実行する必要はありません。つまり、ページを開くたびに、または PHP から提供される AJAX リクエストごとに GC が走る。

そのため、実際のサーバーの負荷と使用状況に応じて、管理者は GC を実行する頻度について知識に基づいた推測を行うことが期待されます。

しかし、OP の元の推論には問題のある欠陥があります - that garbage collection will occur on any idle session. 私がマニュアルを読んだ方法では、アイドル状態のセッションだけでなく、任意のセッションでガベージ コレクションが発生します。

session.gc_maxlifetime integer:データが「ガベージ」と見なされ、場合によってはクリーンアップされるまでの秒数を指定します

したがって、セッション (アイドルかどうか) の有効期間は で決定gc_maxlifetimeされますが、GC が開始された瞬間 (ドキュメントで「潜在的に」と言われているように) は実際には と で決定されgc_probabilityますgc_divisor

再開するには、質問に対する私の遅い答えは次のようになります-通常の状態では、すべてのリクエストでGCを実行しません(あなたが言及した1/1シナリオ)。

  1. それは深刻なやり過ぎのようです。あるレベルでは、おそらく何千もの (悪くはないにしても) IF になり、THEN に入るのは 1 回だけです。
  2. アイドル状態のユーザーだけでなく、60分後にシステム上のすべてのユーザーをログアウトします。
于 2018-07-03T09:29:30.907 に答える