セッション制御と言えば、ほとんどの人は「そんな簡単なことではないか」と思うでしょう。 COOKIEとSESSIONだけじゃないの?
確かにCookieとセッションですが、その使い方を本当に知っていますか?
数年前のインタビュー中に次のような質問に遭遇しました:
セッションが 1 時間後に期限切れになるようにするにはどうすればよいですか?
当時、これは単純ではないと思いました。gc_maxlifetime を 3600 に設定するだけです。当時の面接官は、回答は誤りであり、1時間後に無効になる保証はないと述べた。もちろん彼は理由を教えてくれませんでした。後で帰ってよく調べてみたら分かりました。
この質問に答える前に、Cookie とセッションについての知識を広めましょう。
保存場所の違い:
cookieクライアント側のストレージ
セッションはサーバー側に保存されます
それらの間の接続:
サーバーがセッションを開きます。つまり、
session_start();
の後、一意の ID (session_id) が生成され、応答ヘッダーを通じてクライアントに伝えられます。クライアントがそれを取得すると、Cookie に保存されます。クライアントが再度リクエストを開始すると、この情報が提供されます。この情報を受信したサーバーは、セッション ファイルが保存されているディレクトリに移動して、対応するファイルを見つけ、それを見つけた後、セッション情報を抽出します。このメカニズムを通じて、サーバーはクライアントの ID を識別します。
したがって、Cookie が存在しない場合、セッションは意味を持ちません。
Cookie とセッションの関係を紹介した後、セッションの有効期間について説明します。
SESSION ガベージ コレクション
通常、PHP のデフォルトのセッション有効期間は 24 分です。この時間を超えてもクライアントがリクエストを発行しなかった場合、ガベージ コレクション メカニズムがトリガーされ、期限切れのセッション ファイルが削除される可能性があります。なぜそれが可能なのでしょうか?これはガベージメカニズムの原理についてです。
PHP のセッション ガベージ コレクションは確率的であり、その確率は session.gc_probability と session.gc_diviso によって決まります。確率は
session.gc_probability/session.gc_diviso
php のデフォルトの gc_probability は 1、gc_diviso のデフォルトは 100 です。これは、各リクエストに対してガベージ コレクションがトリガーされる確率が 1/100 であることを意味します。一般に、Web サイトへのアクセス数が多い場合、この確率を 1/1000 などに増やして IO 操作を減らすことができます。
もう 1 つの注意点があります: たとえば、クライアント A はこの時点で新しいセッションを作成しました (セッションは 10 分間有効です)。8 分後に、A は別のリクエストを送信しました。この時点で、彼のセッションは 2 分で期限切れになりますか、それとも 10 分で期限切れになりますか?
答えは10分後です。 2回目のリクエスト以降、サーバー側のセッションファイルの変更時刻も変化したためです。ガベージ コレクションは、セッション ファイルの最終変更時刻を調べます。しかし、もう一度考えてみてください。対応する Cookie の有効期間も更新されるのでしょうか?残念ながら、Cookie の有効期間は更新されません。
セッション ファイルの有効期限が 1 時間以内に期限切れになることを確認する方法
次に、元の質問、つまり、セッション ファイルの有効期限が 1 時間以内であることを確認する方法を見てみましょう。セッション ファイルは 1 時間で期限切れになります。セッション ガベージ コレクションは確率的なイベントであるため、当てにできません。
では、Cookieの有効期間を設定するのは、cookie_lifetimeを設定することでできるのでしょうか?
答えはまだノーです。 Cookie はクライアント側にありますが、それは失われています。次のリクエストで Cookie を持ち込むことができないだけですが、対応するセッション ファイルはまだ存在します。
実際、この問題を解決する最も簡単な方法は、セッションを Redis に保存し、Redis キーの有効期限を使用して 1 時間以内に期限切れになるようにすることです。この方法もお勧めの方法です
#しかし、PHP しか使えない場合はどうすればよいでしょうか?
セッションごとにタイムスタンプを設定し、アクセスするたびにタイムスタンプを決定できます。コードを貼り付けます:
<?php session_start([ 'cookie_lifetime' => 3600, 'gc_maxlifetime' => 3600 ]); if (isset($_SESSION['lifetime']) && $_SESSION['lifetime'] > time()) { // 未过期,更新session的lifetime及cookie的有效期 $_SESSION['lifetime'] += 3600; $tmpVal = $_COOKIE[session_name()]; setcookie(session_name(), $tmpVal, time() + 3600, '/'); } else { // 过期删除 $_SESSION = []; if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time() - 100, '/'); } session_destroy(); }
このコンテンツを読めば、誰もが PHP セッションについてより深く理解できるはずです。
以上がPHP セッション制御: Cookie とセッションの違いと使用法についての深い理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。