1. php
におけるセッション生成の仕組み
まず、PHP でセッションがどのように生成されるかを分析してみましょう。セッションを設計する目的は、HTTP プロトコル (ステートレス) の欠点を補うために、各ユーザーのさまざまな状態を維持することです。ここで質問があります。セッションは各ユーザーのステータスを維持するためにサーバーに保存されることは誰もが知っていますが、ユーザーを区別するために何を使用するのでしょうか?このとき、Cookie を使用する必要があります。コード内で session_start(); を呼び出すと、PHP は SESSION ストレージ ディレクトリ (デフォルトは /tmp/) とクライアントの Cookie ディレクトリにファイルを生成します。セッションファイル名は次のようになります:
形式は sess_{SESSIONID} です。session_start(); に次の 2 行のコードを追加すると、セッション ファイルには内容がありません。
$_SESSION['name'] = 'wanchun0222';
$_SESSION['ブログ'] = 'coderbolg.com';
ファイルには次の内容が含まれています:
名前|s:11:「wanchun0222」;ブログ|s:13:「coderbolg.com」;
この時点でもう一度クッキーを見てください:
サーバーが自動的に Cookie を生成したことがわかります。Cookie の名前は「PHPSESSID」で、Cookie の内容は文字列です。実際には、この文字列は {SESSIONID} です。セッションを使用すると、PHP は最初に一意の SESSIONID 番号 (2bd170b3f86523f1b1b60b55ffde0f66 など) を生成し、次にファイル名が sess_{SESSIONID} であるファイルをサーバーのデフォルト ディレクトリに生成することはすでに理解されているかもしれません。 、現在のユーザーでクライアントが Cookie を生成し、その内容が記述されています。このようにして、PHP はユーザーごとに SESSIONID を生成します。これは、ユーザーごとに 1 つのセッション ファイルを意味します。 PHP は、初めてユーザーのセッションを使用するときに、クライアントに Cookie を書き込みます。ユーザーが次回アクセスすると、ブラウザーはこの Cookie を取得した後、内部の SESSIONID を読み取って保持します。セッション ディレクトリに移動してセッション ファイルを見つけます。見つかった後は、$_SESSION['blog'] が呼び出されたときに表示されます。
2. php
のセッション有効期限リサイクルメカニズム
セッションの生成と動作原理を理解し、セッション ディレクトリに多数のセッション ファイルが存在することがわかりました。もちろん、これらのファイルは永久に存在してはならないため、PHP は期限切れのリサイクル メカニズムを提供する必要があります。 php.ini では、session.gc_maxlifetime によってセッションの生存時間が設定されます (デフォルトは 1440 秒)。セッション ファイルの最終更新時間が生存時間を超えた場合、セッション ファイルは期限切れとみなされます。次回のセッションでリサイクルされます
時間が削除されます。次のセッションはいつリサイクルされますか?これは php リクエストの数に関係します。 PHP の内部メカニズムでは、php が N 回リクエストされると、リサイクルメカニズムが 1 回トリガーされます。リクエストがトリガーされる回数は、次の 2 つのパラメーターによって制御されます:
session.gc_probability = 1
session.gc_divisor = 100
これは php.ini のデフォルト設定であり、100 個の PHP リクエストごとに 1 回のリサイクルが発生することを意味します。確率は gc_probability/gc_divisor です。サーバー側のセッション有効期限のメカニズムについて学習しました。次に、クライアント側の Cookie の有効期限のメカニズムを見てみましょう。
Cookie の有効期限が切れると、当然ながらブラウザはサーバーに Cookie を送信できなくなります。このとき、サーバーのセッション ファイルが存在していても、PHP はどのセッション ファイルを読み込むべきかがわからないため、役に立ちません。 PHP の Cookie の有効期限は作成時に設定されることはわかっていますが、セッションの作成時にクライアント用に PHP によって作成される Cookie のライフサイクルはどのようなものでしょうか?これはphp.ini: session.cookie_lifetimeで設定されます。この値のデフォルトは 0 です。これは、ブラウザが閉じるとすぐに SESSIONID が無効になることを意味します。つまり、session.gc_maxlifetime と session.cookie_lifetime を同じ値に設定することで、セッションの有効期限を制御できます。
3. phpにおけるセッションのクライアントストレージ機構
上記の説明から、ユーザーが Cookie をオフにすると、セッションはまったく機能しなくなることがわかります。はい、そうです。 PHPのセッションのクライアント側ストレージメカニズムはCookieのみですか?いいえ。 SESSIONID は Cookie を通じて各ページに渡すことができないため、ページ GET を通じて値を渡すという別の魔法の武器があります。
php.ini の session.use_trans_sid が 1 に設定されている場合、Cookie が無効になっている場合、PHP は GET を通じてページ間で SESSIONID を自動的に渡すことができます。現時点では、クライアントで Cookie が無効になっているときにセッションを使用し、現在のページをクリックして別のページにリンクすると、PHP は次のように SESSIONID パラメーターをリンクに自動的に追加します: nextpage.php?SESSIONID=2bd170b3f86523f1b1b60b55ffde0f66。この方法には安全性が十分ではないという欠点があることがわかると思います。
: 転載元: ブルーハワイ