セッションはサーバーのグローバル変数です。なぜデータを失わずに、またクライアントにデータを保存せずに異なるページ間を切り替えることができるのでしょうか? セッションの動作原理と使用法を見てみましょう。
ご存知のとおり、http プロトコルはステートレス プロトコルです。簡単に言うと、Web サーバーは誰が接続しているのかを知りません。情報を選択的に送信する必要があるため、HTTP プロトコルには多くの拡張が行われています。この目的を達成するため、デジタル署名、Cookie、セッションなど。
Web サーバーまたは Web プログラムは、現在誰が接続しているかをどのようにして知ることができるのでしょうか?この問題を解決するには、まずサーバーとクライアントの間で 1 対 1 の対応関係を確立する必要があります。以下では、http のコンテンツを取得してこの対応関係を確立する方法を説明します。
httplook という http パケット スニッフィング ツールを使用し、ローカル Web サーバーのルート ディレクトリに test.php というファイルを作成します。アドレスは http://localhost/test.php です。ブラウザはこのページを繰り返し開きます。
コードは次のとおりです | コードをコピー |
session_start(); if (isset($_SESSION['test_sess'])){ $_SESSION['test_sess']++; }その他{ $_SESSION['test_sess'] = 0; } echo $_SESSION['test_sess']; ?>; |
以下は、サーバーに送信される最初の 2 つのメッセージとサーバーから返される情報です
引用: 「First Request Server」によって投稿された元の投稿:
コードは次のとおりです | コードをコピー |
/test.php HTTP/1.1 を取得 受け入れる: */* リファラー: http://localhost/ 受け入れ言語: zh-cn Accept-Encoding: gzip、deflate ユーザーエージェント: Mozilla/4.0 (互換性; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322) ホスト: ローカルホスト 接続: キープアライブ |
引用: 「初めてサーバーが戻った」によって投稿された元の投稿:
コードは次のとおりです | コードをコピー |
HTTP/1.1 200 OK 日付: 2005 年 8 月 26 日金曜日 07:44:22 GMT サーバー: Apache/2.0.54 (Win32) SVN/1.2.1 PHP/5.0.4 DAV/2 X-Powered-By: PHP/5.0.4 セットクッキー: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; パス=/ 有効期限: 1981 年 11 月 19 日木曜日 08:52:00 GMT キャッシュ制御: no-store、no-cache、must-revalidate、post-check=0、pre-check=0 プラグマ: キャッシュなし コンテンツの長さ: 1 キープアライブ: タイムアウト = 15、最大 = 99 接続: キープアライブ コンテンツタイプ: 文字セット=utf-8 コンテンツ言語: オフ |
引用: 「第 2 リクエスト サーバー」によって投稿された元の投稿:
コードは次のとおりです | コードをコピー |
/test.php HTTP/1.1 を取得 受け入れる: */* リファラー: http://localhost/ 受け入れ言語: zh-cn Accept-Encoding: gzip、deflate ユーザーエージェント: Mozilla/4.0 (互換性; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322) ホスト: ローカルホスト 接続: キープアライブ クッキー: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3 |
引用: 「Server Returns Second Time」によって投稿された元の投稿:
コードは次のとおりです | コードをコピー |
HTTP/1.1 200 OK 日付: 2005 年 8 月 26 日金曜日 07:44:23 GMT サーバー: Apache/2.0.54 (Win32) SVN/1.2.1 PHP/5.0.4 DAV/2 X-Powered-By: PHP/5.0.4 セットクッキー: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; パス=/ 有効期限: 1981 年 11 月 19 日木曜日 08:52:00 GMT キャッシュ制御: no-store、no-cache、must-revalidate、post-check=0、pre-check=0 プラグマ: キャッシュなし コンテンツの長さ: 1 キープアライブ: タイムアウト=15、最大=98 接続: キープアライブ コンテンツタイプ: 文字セット=utf-8 コンテンツ言語: オフ |
これらの出力を注意深く比較すると、2 番目のリクエストには最初のリクエストよりも多くの出力が含まれています。
クッキー: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3
このヘッダーは Cookie 情報をサーバーに送信し、PHPSESSID という名前の Cookie があり、その内容が bmmc3mfc94ncdr15ujitjogma3 であることをサーバーに伝えます。
このクッキーはどこから来たのですか?初めてサーバーから返された情報を見てください:
セットクッキー: PHPSESSID=bmmc3mfc94ncdr15ujitjogma3; パス=/
これは、サーバーがクライアント ブラウザに Cookie を書き込むときの名前であり、値は bmmc3mfc94ncdr15ujitjogma3 です。この値は実際にはいわゆる session_id です。
引き続きサーバーへの 2 番目のリクエストを確認すると、Cookie PHPSESSID が依然としてサーバーに送信されています
セッションの使用状況を見てみましょう
PHPでのセッションの使い方
PHP のセッションはデフォルトでクライアント Cookie を使用します。クライアントの Cookie が無効になっている場合、Cookie は自動的に Query_String を介して渡されます。
Phpにはセッションを処理するための関数が全部で11個あります。その中からいくつかの関数を詳しく紹介します。
1.セッション開始
機能: セッションを開始するか、既存のセッションを返します。
関数プロトタイプ: boolean session_start(void);
戻り値: ブール値
関数の説明: この関数にはパラメータがなく、戻り値は true です。この関数を最初に置くのが最善であり、その前に出力があってはなりません。そうしないと、次のようなアラームが発行されます。 警告: セッション キャッシュ リミッターを送信できません - ヘッダーはすでに送信されました (出力は /usr/local/apache/ で開始されました) htdocs/cga /member/1.php:2) /usr/local/apache/htdocs/cga/member/1.php の 3 行目
2.セッション登録
機能: 新しい変数をセッション変数として登録します
関数プロトタイプ: boolean session_register(文字列名);
戻り値: ブール値。
関数の説明: この関数は、グローバル変数内の現在の SESSION に変数を追加します。成功すると、パラメーター名は、論理値 true を返します。 $_SESSION[name] または $HTTP_SESSION_VARS[name] の形式を使用して、値を取得または割り当てることができます。
3. セッションが登録されました
機能: 変数がセッション変数として登録されているかどうかを確認します。
関数プロトタイプ: boobean session_is_registered(文字列名);
戻り値: ブール値
関数の説明: この関数は、指定された変数が現在のセッションに登録されているかどうかを確認することができます。パラメーター名は、確認対象の変数名です。成功すると、論理値 true が返されます。
4. セッション_登録解除
機能: 登録されている変数を削除します。
関数プロトタイプ: boolean session_session_unregister(文字列名);
戻り値: ブール値
関数の説明: この関数は、現在のセッションのグローバル変数内の変数を削除します。パラメータ名は削除する変数の名前で、成功した場合は true を返します
。
5. セッションデストロイ
機能: 現在のセッションを終了し、セッション内のすべてのリソースをクリアします。
関数プロトタイプ: ブール型セッション destroy(void);
戻り値: ブール値。
関数の説明: この関数は現在のセッションを終了します。この関数にはパラメーターがなく、戻り値は true です
上記で紹介した関数を以下で使用しますが、セッション関連の関数もいくつか紹介します:
6. セッションエンコード
機能: セッション情報のエンコード
関数プロトタイプ: 文字列 session_encode(void);
戻り値: 文字列
関数の説明: 返される文字列には、グローバル変数の各変数の名前と値が次の形式で含まれます。 a|s:12:"it is a test";c|s:4:"lala"; a は変数です。 name s :12 は変数 a の値を表します。「これはテストです。長さは 12 です。変数はセミコロン「;」で区切られています。
7. セッションデコード
機能: セッション情報のデコード
関数プロトタイプ: ブール値 session_decode (文字列データ)
戻り値: ブール値
関数の説明: この関数はセッション情報をデコードし、成功した場合は論理値 true を返します
8. セッション名
機能: 現在のセッション名にアクセスします
関数プロトタイプ: boolean session_name(string [name]);
戻り値: 文字列
関数の説明: この関数は、現在のセッションの名前を取得またはリセットできます。パラメータ名がない場合、パラメータを追加するということは、セッション名をパラメータ名に設定することを意味します
。
9. セッションID
機能: 現在のセッション識別番号にアクセスします
関数プロトタイプ: boolean session_id(string [id]);
戻り値: 文字列
機能説明: この機能は、現在保存されているセッションの識別番号を取得またはリセットできます。パラメータidがない場合は、現在のセッションの識別番号のみを取得することを意味し、パラメータを追加すると、新たに指定したidにセッションの識別番号が設定されることになります。
10. セッション解除
機能: 登録されている変数をすべて削除します。
関数プロトタイプ: void session_unset (void)
戻り値: ブール値
関数の説明: この関数はセッションを終了しないという点で Session_destroy とは異なります。 session_unregister 関数を使用してすべてのセッション変数を 1 つずつログアウトするのと同じように
次の結論が導き出されます:
1. セッションが使用されている限り、セッションは Cookie を通じてクライアントのブラウザーに送信されます
2. サーバーにリクエストが行われるたびに、ローカルブラウザはリクエスト情報にCookieを添付します