PHP でのセッション タイムアウト:ベストプラクティス
-
11-09-2019 - |
質問
実際の違いは何ですか session.gc_maxlifetime
そして session_cache_expire()
?
ユーザー セッションが 15 分間非アクティブになった後に無効になるようにしたいとします (最初にセッションが開かれてから 15 分間は無効になりません)。そこで役立つのはどれですか?
私にもできることはわかっています session_set_cookie_params()
これにより、ユーザーの Cookie が一定の時間で期限切れになるように設定できます。ただし、Cookie の有効期限とサーバー側での実際のセッションの有効期限は同じではありません。Cookieの有効期限が切れるとセッションも削除されますか?
私が考えているもう一つの解決策は簡単です$_SESSION['last_time'] = time()
すべてのリクエストで、セッションを現在時刻と比較し、それに基づいてセッションを削除します。ただし、これを処理するためのもっと「組み込みの」メカニズムがあることを期待していました。
ありがとう。
解決
毎回 セッション開始 セッション ファイルのタイムスタンプ (存在する場合) が更新され、session.gc_maxlifetime を超えているかどうかの計算に使用されます。
さらに重要なのは、session.gc_maxlifetime 時間を超えた後にセッションが期限切れになることに依存できないことです。
PHP は、現在のセッションがロードされた後、期限切れのセッションに対してガベージ コレクションを実行します。 session.gc_probability そして session.gc_divisor ガベージ コレクションが実行される確率を計算します。デフォルトでは確率は 1% です。
訪問者の数が少ない場合、有効期限が切れて削除されるべきセッションに非アクティブなユーザーがアクセスする可能性があります。これが重要な場合は、セッションにタイムスタンプを保存し、ユーザーが非アクティブであったログを計算する必要があります。
この例では、 セッション開始 そしてタイムアウトを強制します:
function my_session_start($timeout = 1440) {
ini_set('session.gc_maxlifetime', $timeout);
session_start();
if (isset($_SESSION['timeout_idle']) && $_SESSION['timeout_idle'] < time()) {
session_destroy();
session_start();
session_regenerate_id();
$_SESSION = array();
}
$_SESSION['timeout_idle'] = time() + $timeout;
}
他のヒント
私は、php.iniサーバーの設定が作るどのように良い答えを探していくつかの時間を費やし セッションが期限切れになります。私はたくさんの情報を見つけましたが、それはなぜ把握するためにしばらく時間がかかりました 設定は、彼らが行うように動作します。あなたが私に似ている場合、これはあなたに役に立つかもしれません。
セッションをファイルとしてクッキー(クライアントPC上のファイル)またはサーバ側として格納されています サーバー上。どちらの方法にも長所と短所があります。
サーバー上に保存されたセッションでは、三つの変数が使用されています。
session.gc_probability session.gc_divisor session.gc_maxlifetime
(session.gc_probability /はsession.gc_divisor)は、確率を生成します ガベージコレクションのルーチンが実行されます。ガベージコレクタは、それを実行すると 少なくともsession.gc_maxlifetimeアクセスされなかったセッションファイルをチェック それらを削除します。
これは、すべての(!これは特に)フォーラムの投稿にはかなりよく説明されている - しかし、 質問を以下の出てくるん:
1。)どのように確率が適用されますか?ときに、サーバーは、サイコロを転がしていますか?
A:サーバーはすべての時間のsession_start()が呼び出された時にサイコロを振り サーバー上の任意のアクティブなセッション。だから、これはあなたがゴミを見るべきであることを意味します コレクタ)(SESSION_STARTごとに100回おおよそ一度実行が呼び出されます あなたがsession.gc_probabilityのデフォルトを持っている場合= 1とはsession.gc_divisor = 100
2。)低ボリュームサーバー上でどうなりますか?
A:にsession_start()がそれを呼ばれる最初のセッションをリフレッシュします 使用可能なセッションの値。これは、上のあなたのセッションファイルに時刻を更新します サーバ。その後、サイコロを振り、それは(100チャンスのうち1)を勝てば、それは、ガベージコレクタを呼び出します。ガベージコレクタは、すべてのセッションIDのファイルをチェックし、存在する場合は見ています 削除対象であることあらゆるます。
これは、サーバー上の唯一の人であれば、あなたのセッションがすることを意味します 決して非アクティブに行かないと設定は何を持って変更するかのように、それは表示されません 効果。あなたは10とsession.gc_probabilityにsession.gc_maxlifetimeを変更するとしましょう 100にこれは、そこにガベージコレクタが実行される100%の確率であり、意味します 最後の10秒以内にアクセスされていない任意のセッションファイルをクリアします。
あなたは、サーバー上で一つだけなら、あなたのセッションは削除されません。あなたは必要とします あなたが非アクティブ行くために、少なくとも1つの他のアクティブセッションを実行。
だから、基本的に、低ボリュームサーバー上または低音量時 - それははるかに可能性があり ガベージコレクタが実際に実行する前にsession.gc_maxlifetimeよりも長く、 セッションが実際に削除されます。そして、これがどのように機能するかを知らなくても、それがかもしれません あなたに完全にランダムに表示されます。
3。)なぜ彼らは、確率を使用していますか?
A:パフォーマンス。数量に応じたサーバー上では、ガベージコレクタをしたくありません )のsession_start(のすべての要求で実行されています。これは、サーバーが遅くなります 不必要。だからあなたのサーバボリュームに応じて、あなたが増加することをお勧めします またはガベージコレクタが実行される確率を下げます。
私はこれがあなたのために物事を結びつけることを願っています。あなたは私に似ている、あなたがしようとした場合 あなたはそれを試してみましたのでsession.gc_maxlifetime、それは(動作していないようでした 開発サーバー上のうち誰にも邪魔にならないように)、このポスト うまくいけばあなたにいくつかの頭のスクラッチを保存します。
グッドラック!
のsession.gc_maxlifetime がセッションファイルが変更された前回のオフに基づいています。だから、別のページに呼び出されたセッションファイルが変更されるたびかのsession_start()は、gc_maxlifetimeへのカウントダウンが新たに開始し、ユーザーは、「ログイン」のまま。これは、あなたが探している値です。あなたはそれ
へのアクセス権を持っている場合は、あなたのPHPファイル、または編集php.iniでini_set()を介してこれを変更することができますsession_cache_expire()のみHTTPを制御ヘッダを "有効期限"。ダウンロードされたページの内容がユーザーのブラウザのキャッシュにとどまるどのくらいこのヘッダーコントロールます。
現在の値を確認するには、このコードは参考になります。
$gc_maxlifetime = ini_get('session.gc_maxlifetime');
$gc_probability = ini_get('session.gc_probability');
$gc_divisor = ini_get('session.gc_divisor');