ホームページ  >  記事  >  バックエンド開発  >  PHP セッション制御: セッションと Cookie の詳細な説明、sessioncookie_PHP チュートリアル

PHP セッション制御: セッションと Cookie の詳細な説明、sessioncookie_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:18:10906ブラウズ

PHPセッション制御:セッションとCookie、sessioncookieの詳細説明

この記事では、PHP セッション制御について紹介し、主に次の点について詳しく説明します:

• セッション制御の背景/概念
• Cookie のメンテナンスとライフサイクル (有効期間)
• セッションのメンテナンスとライフサイクル (リサイクルメカニズム)
• クッキーとセッションの違いと関係
• 質問 1: Cookie を無効にするとセッションが無効になるのはなぜですか?
• 問題 2: IE ブラウザでセッションが失われ、ページが更新されるたびに新しいセッション ID が生成されます (Firefox ブラウザは正常です)
• セッションとクッキーの簡単な例

セッション制御の概念を理解する

概念を理解するには、その背景とその作成理由を理解する必要があります。ここでは、WEB 環境とその HTTP プロトコルについて説明します。セッション制御の背景:
HTTP プロトコルに関する情報を読んだ学生は、HTTP プロトコルが WEB サーバーとクライアント (ブラウザ) の間の相互通信のためのプロトコルであることを知っています。いわゆるステートレスとは、http を維持しないことを意味します。 http リクエストは独立しており、永続的ではありません。言い換えれば、HTTP プロトコルには、2 つのトランザクション間のステータスや関係を維持するためのメカニズムが組み込まれていません。ユーザーがあるページをリクエストし、次に別のページをリクエストした場合、HTTP は 2 つのリクエストが同じユーザーからのものであるかどうかを判断できません。

これは、私たちがフォーラムの投稿を閲覧したり、電子商取引 Web サイトで買い物をしたりするときに、このサイトにいる限り、あるページから別のページにどのようにジャンプしても、Web サイトは常にそれを覚えていることを非常に奇妙に感じます。私は何者ですか、何を購入したかを教えてください。これがどのように行われるかは、誰もが想像していると思いますが、これは HTTP セッション制御の使用です。 Web サイト内の変数を追跡します。変数を追跡することで、複数のリクエスト間の接続を確立し、認可とユーザー ID に基づいて異なるコンテンツやページを表示できます。

PHP セッション制御:

PHP のセッションは、一意のセッション ID によって駆動されます。セッション ID は、PHP によって生成された暗号化された乱数であり、セッションのライフサイクル中にクライアントに保存されます。クライアント (つまりブラウザ) はデータを Cookie に保存するだけであることがわかっているため、PHP のセッション ID は通常、ユーザーのマシンの Cookie に保存されます。 Cookie について理解すると、ブラウザが Cookie を無効にしてセッションが無効になる可能性があることがわかります。したがって、PHP セッション制御には、URL でセッション ID を渡す別のモードがあります。 Web サイトを閲覧するときに少し注意してみると、URL に乱数のような文字列が含まれている場合は、URL 形式のセッション制御である可能性が高くなります。

この時点で、クライアントはセッション ID のみを保存するので、ショッピング時に購入したアイテムのリストなど、セッション制御に保存されるセッション変数はどこに保存されるのかという疑問を持つ人もいるかもしれません。明らかに、セッション変数はサーバー側で使用されるため、これらのセッション変数はサーバー側に保存する必要があります。デフォルトでは、セッション変数はサーバー上の通常のファイルに保存されます (自分で設定してデータベースを使用して保存することもできます。セッション ID は、ファイル内のセッションを検索するキーのように機能します)。 session は、購入したアイテムのリストなど、ID に対応するセッション変数をサーバー側に保存します。

その後、セッション制御のプロセス全体は次のようになります。ユーザーが初めてサイトのページにログインするか閲覧すると、サイトは PHP セッション ID を生成し、Cookie を通じてクライアント (ブラウザー) に送信します。 。ユーザーがサイト上の別のページをクリックすると、ブラウザはこの URL への接続を開始します。接続する前に、ブラウザーはまずローカルに保存された Cookie を検索し、接続中の URL に関連する Cookie があれば、それをサーバーに送信します。ログイン時または初めて接続した際に、WebサイトのURL(保存されたセッションID)に関連付けられたCookieが生成されているため、ユーザーが再度このサイトに接続したとき、サイトはこのセッションIDによってユーザーを識別できます。このセッション ID に関連するセッション変数は、トランザクション間の連続性を維持するためにサーバーのセッション ファイルから取得されます。

次に、Cookie とセッションという 2 つの重要な概念を理解しましょう

Cookieのメンテナンスとライフサイクルについて

Cookie はサーバー側で作成され、クライアント ブラウザに書き戻されます。ブラウザは、応答ヘッダーに Cookie を書き込むための指示を受け取り、ローカルの一時フォルダーに保存します。

Cookie のコンテンツを保存する Cookie ファイルを作成します。Cookie のコンテンツはキーと値のペアで保存され、キーと値は両方とも文字列のみにすることができます。例:
ファイル: Cookie:administrator@localhost/
コンテンツ形式: voteID100101localhost/15361167667230343893360385046430343691*

クッキーの作成:

コードをコピーします コードは次のとおりです:

setcookie()関数はCookieを設定します。関数のプロトタイプは次のとおりです
setcookie(名前、値、有効期限、パス、ドメイン);

注: Cookie ヘッダーは他のヘッダーよりも前に送信する必要があります。送信しないと効果がありません (これは Cookie の制限であり、PHP の制限ではありません)。 Cookie の値は、Cookie の送信時に自動的に URL エンコードされ、取得時に自動的にデコードされます (URL エンコードを防ぐには、代わりに setrawcookie() を使用します)。

クッキーのメンテナンス:

cooke には、Cookie 名、ドメイン、パス、セキュア タグの 4 つの識別子があります。今後この Cookie の値を変更するには、同じ Cookie 名、ドメイン、パスを持つ別の Set-Cookie ヘッダーを送信する必要があります。これは新しい

に置き換えられます。

値を使用して、元の Cookie 値を上書きします。ただし、これらのオプションの 1 つだけを変更すると、たとえば名前の値を変更するだけで、まったく異なる Cookie が作成されます。

Cookieの有効期限:

有効期限を設定できます。設定されていない場合は、セッションレベルになります。つまり、ブラウザを閉じると表示されなくなります。 Cookie の作成時には有効期限が含まれており、この有効期限は name-domain-path-secure で識別される Cookie に関連付けられます。 Cookie の有効期限を変更するには、同じ組み合わせを指定する必要があります。 Cookie の値を変更する場合、有効期限は Cookie の識別情報の一部ではないため、毎回設定する必要はありません。例:

コードをコピーします コードは次のとおりです:

setcookie(vote,$id+1,time()+3600*24);
setcookie(vote,$id);

Cookie 識別子が同じであるため、Cookie の有効期限は変わりません。実際、Cookie の有効期限は手動で変更しない限り変わりません。これは、同じセッション内では、セッション Cookie が永続 Cookie (複数のセッションにわたって存在できる Cookie) になることはできますが、その逆はできないことを意味します。永続 Cookie をセッション Cookie に変更するには、永続 Cookie を削除する必要があります。これは、有効期限を過去の特定の時刻に設定し、同じ名前のセッション Cookie を作成することで実現できます。

有効期限は、ブラウザが実行されているコンピュータのシステム時間に基づいて確認されることに注意してください。システム時刻がサーバー時刻と同期しているかどうかを確認する方法がないため、サーバー時刻とブラウザのシステム時刻に差異がある場合、この設定ではエラーが発生します。

自動的に削除されるCookie:

Cookie は通常、次の理由でブラウザによって自動的に削除されます:
セッションクッキー(Session cookie)はセッションが終了する(ブラウザを閉じる)と削除されます
次のような永続的な Cookie は、有効期限に達すると削除されます:

コードをコピーします コードは次のとおりです:

setcookie("投票", "", time()-3600);

ブラウザの Cookie 制限に達すると、新しい Cookie 用のスペースを確保するために Cookie が削除されます。

セッションのメンテナンスとライフサイクルについて

セッションは、アプリケーションサーバーによって維持されるサーバー側のストレージスペースであり、ユーザーがサーバーに接続すると、サーバーによって一意のセッションIDが作成および生成され、このセッションIDはサーバー側にアクセスするための識別子として使用されます。セッションストレージスペースは、セッション中に割り当てられます。クライアントに与えられた一意のセッションIDは、現在のユーザーを識別し、他のユーザーと区別するために使用されます。 SessionID を介して各アクセス要求を受け入れ、現在のユーザーを識別し、ユーザー固有の情報とセッション変数を追跡および維持します。セッション変数は、セッションに数値またはテキスト情報を保存します。この情報はサーバー側に保存されます。もちろん、セッション ID をセッション情報としてデータベースに保存し、セッションを永続化することもできます。これにより、ユーザーのログイン数、オンラインかどうか、オンライン時間などを追跡して、HTTP ステートレスなもの間の関係を維持できます。セッションのコンテンツ ストレージはキーと値のペアのリストであり、キーは文字列型です。セッションのストレージはより便利で、値はオブジェクトにすることができます。

セッション中、セッションはクライアントとサーバー上の 2 つのファイルに保存されます。クライアントはセッション ID を Cookie モード (デフォルトの保存方法) で保存するか、URL 文字列の形式で渡すことができます。サーバー側は通常、指定されたセッションディレクトリにテキスト形式で保存されます。サーバー側では、session.use_cookies を通じてクライアントが使用するストレージ メソッドを制御できます。 Cookie の保存方法として定義されている場合、session.cookie_lifetime を通じてクライアントに保存される Cookie の有効期間を制御できます (デフォルト値は 0、ブラウザを閉じるとクリアされます)。クライアントが Cookie を使用してセッション ID を保存する場合は、「一時的な」Cookie を使用してセッション ID を保存します (Cookie の名前は PHPSESSID です。詳細については、Firebug を通じて確認できます。名前は php.ini セッションを通じて変更できます。 name) の場合、ユーザーがページを送信すると、セッション データにアクセスするためにこの SessionID がサーバーに送信されます。このプロセスには開発者の介入は必要ありません。

セッションの作成:

コードをコピーします コードは次のとおりです:

session_start() //セッションを開始し、既存のセッションを返します

機能: セッションを初期化します。これは、セッションのライフサイクルの始まりでもあります。セッションを使用するには、セッション環境を初期化する必要があります。これは、OOP の概念でオブジェクト インスタンスを作成するコンストラクターを呼び出すのと似ています。セッション初期化操作では、メモリに格納されているセッション データをマップするグローバル配列 $_SESSION を宣言します。セッション ファイルが既に存在し、セッション データが保存されている場合、session_start() はセッション データを読み取り、$_SESSION にデータを入力し、新しいセッション ライフ サイクルを開始します。

注: この関数にはパラメーターがなく、戻り値は true です。Cookie ベースの sessin が使用されている場合、session_satrt() の前に空白を含む出力を含めることはできません。 php.ini で session.auto_start=1 が有効になっている場合、session_start() は各ページで実行されます。このオプションを有効にすると、デフォルトでオフになります。

セッションID:

ユーザーセッションの一意の識別子、ランダムに生成された一意でランダムな文字列。主に他のユーザーのセッションデータを区別するために使用されます。ユーザーが初めて Web ページにアクセスすると、PHP のセッション初期化関数呼び出しによって、現在アクセスしているユーザーに session_id とも呼ばれる一意の ID が割り当てられます。

session_id() を取得:

コードをコピーします コードは次のとおりです:
echo $_COOKIE['PHPSESSID'].'
';
echo $_COOKIE[session_name()].'
';
echo session_id().'
';

セッションデータ:

セッションを通じて保存する必要があるユーザーステータス情報をユーザーセッションデータと呼び、セッションデータとも呼ばれます。通常、これは現在のセッションのライフサイクル内の対応する $_SESSION データです。 session_start() が呼び出されてセッションが初期化されると、セッションのライフサイクルが開始されたことになります。つまり、関連する関数操作 $_SESSION を使用してセッション データを管理できることが発表されています。このセッション ライフ サイクルによって生成されたデータは、リアルタイムではセッション ファイルに書き込まれませんが、$_SESSION 変数を通じてメモリに保存されます。 $_SESSION は配列型のグローバル変数で、セッション ライフ サイクルのセッション データをマップし、メモリに保存されます。セッションが初期化されると、データがセッション ファイルから読み取られ、変数に書き込まれます。セッション (ライフサイクル) の終了時に、$_SESSION データをセッション ファイルに書き込みます。

セッション変数を登録します:

PHP4.1 以降、セッション変数はスーパーグローバル配列 $_SESSION に保存されます。セッション変数を作成するには、次のように配列内の要素を設定するだけです:


コードをコピーします コードは次のとおりです:
$_SESSION['ドメイン'] = blog.jb51.net;
$_SESSION['poll']=$_SESSION[poll] + 1;

セッション変数を使用します:

コードをコピーします コードは次のとおりです:
echo $_SESSION['blogdomain']; // blog.jb51.net を出力します。セッションを使用する前に、まず session_start() 関数を使用してセッションを開始する必要があります

ログアウトセッション変数/セッションを破棄:

コードをコピーします コードは次のとおりです:

unset($_SESSION); // 単一のセッション変数を破棄します
例: unset($_SESSION['blogdomain']);
#unset($_SESSION) この関数はグローバル変数 $_SESSION を破棄しますが、それを復元する適切な方法はありません。ユーザーは $_SESSION 変数を登録できなくなるため、この関数は使用しないでください。

session_unset(); //複数のリリース。セッションファイルに登録されている変数をすべて解放します
#セッションのライフサイクルでは、現在のセッションからすべてのセッション データをログアウトし、$_SESSION を空の配列にします。 unset($_SESSION) との違いは、unset は $_SESSION 変数を直接削除し、メモリ リソースを解放することです。もう 1 つの違いは、session_unset() はセッション ライフ サイクル中にのみ $_SESSION 配列を操作できるのに対し、unset() はセッション ライフ サイクル中にのみ操作できることです。ページ (ページ) ライフサイクル全体で $_SESSION 配列を操作できます。 session_unset() も IO 操作を実行せず、$_SESSION 配列にのみ影響します。

$_SESSION=array(); //複数のリリース、$_SESSION パラメータに登録されているすべての変数を解放します

セッション_デストロイ(); #セッションを使用した後は、まずすべての変数をログアウトしてから、この関数を呼び出して現在のセッションを終了し、セッション内のすべてのリソースをクリアし、サーバー上のセッション ファイルを削除する必要があります。この関数は、サーバー上の設定を解除 (解放) しません。現在のセッション セッション関連のグローバル変数はクライアントのセッション Cookie を削除しません
# session_start() がセッションを初期化すると、セッションがログアウトされます。これは、セッションのライフサイクルが終了したことを意味します。セッションのライフサイクルが完了すると、session_unset および $_SESSION['domain'] は $_SESSION 配列を操作できなくなりますが、$_SESSION 配列は引き続き unset() などの関数によって操作できます。この時点では、セッション平均は未定義であり、$_SESSION はまだグローバル変数であり、マッピング関係の外にあります。
session_destroy() を使用してセッションからログアウトすると、セッションのライフサイクルが終了するだけでなく、セッション ファイルも削除されますが、現在の $_SESSION 変数には影響しません。つまり、IO 操作が生成されます。

備考:

1. PHP のデフォルトのセッションは Cookie に基づいています。Cookie を削除したい場合は、setcookie() 関数を使用する必要があります。 2. session_unset() 関数と unset() 関数の違い:


セッションのライフサイクルでは、session_unset() は現在のセッションからすべてのセッション データをログアウトし、$_SESSION を空の配列にします。 unset($_SESSION) との違いは、unset は $_SESSION 変数を直接削除し、メモリ リソースを解放することです。もう 1 つの違いは、session_unset() はセッション ライフ サイクル中にのみ $_SESSION 配列を操作できるのに対し、unset() はセッション ライフ サイクル中にのみ操作できることです。ページ (ページ) ライフサイクル全体で $_SESSION 配列を操作できます。 session_unset() も IO 操作を実行せず、$_SESSION 配列にのみ影響します。

セッションの有効期間: セッションの有効期限と期限切れのリサイクルメカニズム

セッションの初期化からセッションからログアウトするまでの期間をセッションのライフサイクルと呼びます

デフォルトでは、php は php.ini 設定の session.save_path で設定されたディレクトリにセッションを保存します。ファイル名は sess_ves0d7uvdsab9k6sig73mnn592 です。各ファイルはセッションに対応します。セッションファイルの形式はおおよそ次のとおりです:

コードをコピーします コードは次のとおりです:
poll_200|i:1;poll_100|i:3; //#変数名|型: 長さ: 値


SESSIONのライフサイクルを設定します:

php セッションは Cookie に基づいているため、セッションのライフサイクルを設定するには、まず Cookie の有効期限を設定する必要があります。クライアント (ブラウザなど) が Web サイトにログインするときに、SESSION が有用かどうかを確認するには、まずクライアントに COOKIE があるかどうかを確認し、次に COOKIE 内の SESSION ID を使用してサーバー上のファイルを検索します。


コードをコピーします コードは次のとおりです:
セッション開始(); $lifeTime = 24 * 3600 // 1 日分保存します
; setcookie(session_name(), session_id(), time() + $lifeTime, "/");

実際、PHP5 セッションには、PHP5 セッションの有効期間を設定するための関数 session_set_cookie_params() も用意されています。この関数は、session_start() 関数が呼び出される前に呼び出す必要があります。

コードをコピーします

コードは次のとおりです:

$lifeTime = 24 * 3600 // 1 日分保存します ; session_set_cookie_params($lifeTime); セッション開始();
サーバー側では、PHP はセッション ファイルの有効期限が切れているかどうかをどのように判断するのでしょうか?



コードをコピーします
コードは次のとおりです:


session.gc_maxlifetime = 1440 (初期値)

#セッションの生存時間を設定します。単位は秒です。 GC が開始されるたびに、セッション ファイルの最終アクセス時刻が stat を通じて取得されます。 現在時刻からファイルの最終アクセス時刻を引いた値が session.gc_maxlifetime より大きい場合、ファイルは削除されます。

「現在」までの「最終変更時刻」が session.gc_maxlifetime (デフォルトは 1440) 秒を超えた場合、つまり、ここで設定した時間内にファイルが変更されなかった場合、php5 のセッション以来、セッション ファイルは期限切れとみなされます。パッシブリサイクルメカニズムを採用しており、期限切れのセッションファイルは自然に消えませんが、「リサイクル」をトリガーして期限切れのセッションを処理します。次に、次のセッションがリサイクルされるときに、このファイルが変更されていない場合、セッションファイルは削除されます。セッションは期限切れになります)。

セッションのリサイクルはいつ行われますか?

デフォルトでは、php リクエストごとにリサイクルの確率が 1% あるため、単純に「100 php リクエストごとにリサイクルの確率がある可能性がある」と理解できます。この確率は次のパラメータによって制御されます:

コードをコピーします コードは次のとおりです:

session.gc_probability = 1 (初期値)
session.gc_divisor = 100 (初期値)
#これら 2 つの関数は GC を有効にする確率を決定します。デフォルトは 1/1000 です。つまり、ユーザー リクエストの 1,000 件に 1 件で GC が開始され、セッションがリサイクルされます。 GC プロセスを頻繁に開始することはお勧めできません。アクセス頻度が高すぎる Web サイトや同時実行数が多い Web サイトでは、PHP GC の起動頻度が低下する可能性があります。 PHP GC リサイクル セッションは、PHP の実行効率を低下させます。

これら 2 つを組み合わせたものは、セッションが最初にアクティブ化されたとき (session_start()) に、Gabadge Collection (gc) プロセス管理を開始する確率です。 Gabadge Collection の開始後にセッション情報ファイルを追跡します。起動確率は session.gc_probability/session.gc_divisor です。つまり、すべてのセッション情報ファイルがシステムによって 100% ガベージとして扱われるわけではありません。ブラウザを直接閉じるとセッション情報ファイルがサーバー上に残る場合が多いため、確率を100%に変更するとガバッジコレクションは100%起動しますが、サーバーに負荷がかかり動作が停止してしまいます。 GC自体の意味がなくなってしまった。

追加手順:

1. この場合、session.gc_maxlifetime=1440 であると仮定します。セッション ファイルが最後に変更されたのが 1440 秒前であれば、セッションは次のリサイクル (1/100 の確率) が発生するまで有効です。

2. セッションが session.save_path を使用してセッションを別の場所に保存する場合、セッションのリサイクル メカニズムは期限切れのセッション ファイルを自動的に処理しない可能性があります。現時点では、期限切れのセッションを手動 (または crontab) で削除する必要があります。 cd /path/to/sessions; find -cmin +24

3. サーバー側のセッション ファイルの数が効果的にリサイクルされず、徐々に GB 以上に増加すると、サイトのログインとログアウトの影響でサイトの速度が低下する可能性があることに注意してください。 ;

4. ログ、週次レポート、月次レポートなどを提出する直前に、「無効な操作です。ログインして再試行してください。」というメッセージが表示されることがあります。その理由は明らかです。セッションが無効であり、セッション ファイルが「タイムアウト」になっている可能性があります。

いくつかの特別な状況:

リサイクルメカニズムはファイルの「最終変更時刻」をチェックするため、セッションがアクティブでもセッションの内容が変更されていない場合、対応するセッションファイルは変更されておらず、リサイクルメカニズムはこれを次のようにみなします。アクティブなセッションがないため、削除されます。これは私たちが見たくないものですが、次の簡単なコードを追加することでこの問題を解決できます。


コードをコピーします コードは次のとおりです:
if(!isset($_SESSION['last_access'])||(time()-$_SESSION['last_access'])>120)
$_SESSION['last_access'] = 時間(); ?> //コードは 120 秒ごとにセッションを変更しようとします

Cookieとセッションの違いと関連性を理解する

類似点: どちらも HTTP ステートレスの問題を解決できるため、同じクライアントが情報を保存および設定し、Web サイトにアクセスするための複数のリクエストでリクエストされたもの間の接続を確立できます。

違い: 簡単に言えば、Cookie 情報はクライアント側に保存され、セッション情報はサーバー側に保存されます。

セッションはキーと値のペアを使用します。つまり、ID はクライアント側に保存され、値はサーバー側で対応する値を見つけるために使用されます。はサーバー側に置かれており、制限時間が来るとサーバーが自動的にリサイクル/解放します。

Cookieには2つの方法があり、1つはブラウザの変数に値を保存し、ブラウザを閉じると終了します。もう1つは、期限が切れない限り、それをハードディスクに保存する方法です。次回。

連絡先: クライアントが Cookie メソッドに基づいて保存された SessionID を使用する場合、通常、SessionID は Cookie に保存されます。

注: Cookie は、同じコアを持つブラウザ間で共有されます。Firefox と IE など、異なるコアを持つブラウザは共有されません (保存場所が異なるため、当然共有されません)。カーネルが異なるブラウザは Cookie を共有できず、異なるセッション ID も生成します。

質問 1: Cookie を無効にするとセッションが失敗するのはなぜですか?

まず第一に、説明させてください: セッションは必ずしも Cookie に依存する必要はありませんが、PHP のデフォルトのクライアントのセッション ID は Cookie に基づいて保存されます。

この時点で、PHP クライアントのデフォルトのセッション保存方法は Cookie に基づいているため、クライアントが Cookie を無効にすると、セッションはページ間で無効になることも理解する必要があると思います。この説明が適切かどうかはわかりません。平たく言えば、ステートフルなものをステートフルにするには、セッション ID が Cookie モードで保存されている場合のみ、クライアント側の比較条件が Cookie に設定されます。 Cookie を使用すると、セッションも失われます。 PHP のセッション クライアント ID には通常、Cookie と URL という 2 つの保存方法があります。セッション ID が Cookie に保存されている場合は、ブラウザの Cookie に PHPSESID 変数があることがわかります (Firefox で表示できます)。 URL で渡された場合 (非表示のフォーム配信を使用することをお勧めします)、URL は次の形式で表示されます:index.php?PHPSESID=ves0d7uvdsab9k6sig73mnn592。例:

コードをコピーします コードは次のとおりです:

デモ1.php
session_start();
$_SESSION['ブログ']='http://blog.jb51.net';
echo "test2";
?>

demo2.php
session_start();
echo 'セッション値は'.$_SESSION['ブログ'];
?>

上記のコードを実行すると、クライアント Cookie が正常であれば、demo2.php の $_SESSION['blog'] の値が http://blog.jb51.net として出力されます。ただし、クライアントの Cookie を手動で無効にしてからインスタンスを実行すると、結果が得られない可能性があります。デフォルトのクライアントセッション ID 保存メソッドは、ページをまたいだ後、前のページのセッション ID を読み取ることができないため、session_start(); が実行されると、対応するセッション ID が生成されます。このセッション ID はファイルを開くための「キー」ではないため、前述の最初のセッション ファイル内の変数を取り出すことは不可能です。 session_start(); の前にコード session_id($sessionid); を追加すると、新しいセッション ファイルは生成されず、この ID に対応するセッション ファイルが直接読み取られます。簡単に言うと、前のページでセッション ID を取得し、次のページの session_start() コードの前にコード session_id (passed sessionid) を追加します。

コードをコピーします コードは次のとおりです:

デモ.php
$sid = $_GET['sid'];
if(!empty($sid)){
  session_id($sid);
  session_start();
}その他{
  session_start();
  $sid = session_id();
}
?>



demo2.php
$sid = $_GET['sid'];
if(!empty($sid)){
  session_id($sid);
  session_start();
}その他{
  session_start();
  $sid = session_id();
}
$id = $_POST['id'];
$key = 'poll_'.$id;
if($id!=''){
  echo $key = 'poll'.$id;
  if(!empty($_SESSION[$key])){
    $_SESSION[$key]=$_SESSION[$key] + 1;
  }その他{
    $_SESSION[$key]=1;
    setcookie($key ,$id+1,time()+3600*24);
  }
  echo '<script>alert("success");javascript:location.href="demo.php?sid='.$sid.'";</script>';
}その他{
  echo '<script>alert("失敗しました!ID Null");javascript:history.back(-1);</script>';
}
?>

これ以外に、ゲスト端末の PHPSESID を次のように文書内に保存することもできます:

复制代码代码如下:

デモ.php
session_start();
$_SESSION['blogdomain']= 'http://blog.jb51.net';
$sid=session_id();
$fp=fopen("D:tmpwebsid.txt","w+");
fwrite($fp,$sid);
fclose($fp);
echo 'demo2';

demo2.php
$fp=fopen("D:tmpwebsid.txt","r");
$sid=fread($fp,1024);
fclose($fp);
session_id($sid);
session_start();
print_r($_SESSION);

当ゲスト端末は cookie を無効にしており、次の方法でセッションセッションを変更できます。クライアント端末 cookie を使用します:

1、php.ini 内の session.use_trans_sid = 1 を設定するか、セッションを開始します --enable-trans-sid オプション、PHP 自動転送セッション ID を確認します。session.use_trans_sid が有効な場合、ession.use_only_cookies は固定です。無能0に設定する必要があります。

2、URL 転送値、セッション ID を介して手動で転送されます。

3、ファイル、データベースなどの形式でsession_idを保存し、移行中に手動で使用します。

PHP も提供する関数:


复制代码代码如下:
Output_add_rewrite_var ( string $name , string $value ) # 变量名 变量值


説明: この関数は、URL 書き換えによって名前/値ペアを追加します。この名前のペアは、透明 URL 書き換え時に URL (GET パラメータの形式で) とテーブル (入力ドメインの形式で) に追加されます。 session.use_trans_sid は同時にセッション ID に追加できます。URL(http://jb51.net/..) は再書き込みできないことに注意してください。この関数の実行は url_rewriter.tags php.ini パラメーターによって制御されます。

复制代価

代価如下: session_start();
Output_add_rewrite_var('PHPSESSID',session_id ());
echo 'デモ';
?>



このようなセッション ID は URL の後ろにあり、そこからセッション ID の隠された値が出現することがあります。
セッション客端末IDの変更保存方法:

session.use_cookies //制御ゲスト端末がSessionIDを保持するときは、ある方法を使用し、当它が「1」の場合、就说明启作動了session cookie(初期値は1)

上で提示した関数を使用して、現在のセッション ID を取得できます: echo $_COOKIE["PHPSESSID"];

ただし、クライアントのブラウザが cookie のリクエストをサポートしていない場合、session.use_cookies のパラメータの値が「1」の場合でも、上記のリクエストは null になるだけです。

php.ini 内の 2 つのおよびこれに関連する構成パラメータ:



复制代码


代码如下:

session.use_cookies = 1 //cookies(默认值範囲1)を使用するかどうか session.use_only_cookies=1 // 1 回のみ cookie を使用します。0 回は cookie やその他の方法を使用できます。このとき、ゲスト端末の cookie が使用できる場合、セッションも cookie (許可は 1) です

注: 顧客のブラウザが Cookie をサポートしている場合は、「session.use_only_cookies = 1」にすることを強くお勧めします。 session.use_only_cookies が有効な場合、URL 経由でセッション ID を渡したい場合でも無効とみなされます。セッション ID を経由するパスの数を減らすことができます。上記の 2 つの構成は PHP コード ページで設定されます:

コードをコピーします コードは次のとおりです:

ini_set('session.use_cookies','1');
ini_set('session.use_only_cookies','1');

IEではセッションが失われ、ページが更新されるたびに新しいセッションIDが生成されます(Firefoxブラウザは正常です)

この問題がサーバーまたはサイトで発生した場合は、session.cookie_path の Web サイト ドメインを正しく設定してください。設定が正しくないと、次のような一般的なエラーが発生する可能性があります。

(1) クライアント上の各 PHPSESSID はサーバー上で 1 対 1 に対応し、独立したセッション レコードを生成してサーバーに保存します。そのため、サーバー側のセッション ファイルの冗長性が高まります (GC リサイクル時)。仕組みが異常でサイトアクセス数が多い) 大変)

(2) 関連情報を記録するためにセッションを使用するサイトは、Firefox 以外のブラウザでアクセスすると問題が発生する可能性があります (Chrome はテストされていません)。例: ショッピング カートで購入した商品を記録できない、サイトへのログインが失敗するなど。

コードをコピーします コードは次のとおりです:
session.cookie_path は、セッションが有効になる Web サイトのドメインを指します。
session.save_path は、セッション一時ファイルが保存されるパスを指します。
例: session.cookie_path= / //Cookie の有効なパス


補足: すべてのブラウザーのアクセス更新によって新しいセッション ID が生成される場合は、クライアントで Cookie が無効になっているかどうかを確認してください。

セッションの簡単な例

フォームの繰り返しの送信を防ぐためにセッションを使用します:


コードをコピーします コードは次のとおりです:
session_start();
$_SESSION["番号"] = 0;
if(isset($_POST["アクション"] && $_POST["アクション"]=="投稿")){
if($_SESSION["num"] == 0){
echo "送信成功!";
$_SESSION["番号"] = 1;
}その他{
echo "再度送信しないでください!";
}
}
?>


セッションメソッドを使用したログイン検証のコード例:


コードをコピーします コードは次のとおりです:
session_start();//セッションを開始します。最初の文に配置する必要があります。そうしないとエラーが発生します。
if($_GET['out']){
unset($_SESSION['id']);
unset($_SESSION['pass']);
}
if($_POST['名前']&&$_POST['パスワード']){
//セッションの設定に使用されます< /span>
$_SESSION['id']=$_POST['name'];
$_SESSION['パス']=$_POST['パスワード'];
}
if($_SESSION['id']&&$_SESSION['pass']){
echo "ログイン成功しました!
ユーザーID: ".$_SESSION['id']."
ユーザーパスワード: ".$_SESSION['pass'];
エコー "
";
echo "セッションをログアウト";
}

?>

ユーザーID:
パスワード:






Cookieメソッドを使用したログイン認証のコード例:


コードをコピーします コードは次のとおりです:

if($_GET['out']){ //Cookie をログアウトするために使用されます
setcookie('id',"");
setcookie('pass',"");
echo "<script>location.href='login.php'</script>"; //Cookie は時間内に有効にならず、再度更新したときにのみ有効になるため、ログ記録後にページが自動的に更新されるようにします。外。
}
if($_POST['name']&&$_POST['password']) //変数ユーザー名とパスワードが存在する場合、以下の Cookie を設定します
{ //Cookie の設定に使用されます
setcookie('id',$_POST['name'],time()+3600);
setcookie('pass',$_POST['password'],time()+3600);
echo "<script>location.href='login.php'</script>" // クッキーは時間内に有効になります
}
if($_COOKIE['id']&&$_COOKIE['pass']){ //Cookie が正常に設定された後、Cookie を表示するために使用されます
echo "ログインに成功しました!
ユーザー名: ".$_COOKIE['id']."
パスワード: ".$_COOKIE['pass'];
エコー "
";
echo "Cookie をログアウト"; }
?>
<フォームアクション=""メソッド="投稿">
ユーザーID:
パスワード:





セッションのランダム コードを使用して投票の正当性を検証します:

コードをコピーします コードは次のとおりです:
list.php オプションページ
session_start();
$tokenKey = md5(rand(1,100));
$_SESSION['tokenKey'] = $tokenKey;
注: 値を渡すときは、ランダム コード $tokenKey
を渡します。 vote.php 投票アクション実行ページ

$tokenKey = $_SESSION['tokenKey'];
if($_POST['tokenKey'] != $tokenKey){ //ランダムコードが前のページと同じかどうかを判定します
echo "<script>alert('もう一度投票してください!');location.href='list.php';</script>" //ランダムコードは無効です
終了します;
}その他{
投票操作を実行します;
セッションに保存されたランダムコードをクリアします
}

セッションの問題に対する PHP セッション制御

回答は保存できません。 。 。 ユーザーが Cookie をオフにすると、セッションと Cookie の両方が無効になります

ただし、php のセッションは必ずしも Cookie を必要とするわけではありません
php.ini で session.use_trans_sid の値を見つけて 1 に設定します。無効にした後、サーバーを再起動します。 Cookie を使用しても、セッション ID は引き続き保存でき、クライアントのメモリ
に保存されます。

PHPのセッションとCookieの違いは何ですか?

セッションとクッキーの違い:
1: セッションのコンテンツがファイルに保存されている場合、そのファイルはどこにありますか? 答え: Session.save_path = "D:/tmp",
指定されていない場合は、次の場所に保存されます。デフォルトでは C:/windows/temp 、デフォルトは Linux の「/tm​​p」ディレクトリにあります
2: Cookie とセッションの関係
答え: Cookie は session_id を保存するために使用できます
tangram_guid_1357433851419 アイデア: Cookie が届いたらどうすればよいですかブラウザによって無効になっていますか?
3: session.use_cookies = 1
このオプションはサーバーに指示します: session_id の保存に cookie を使用する
session.use_only_cookies = 0、session_id を渡すためにのみ cookie を使用するかどうか
session.use_trans_sid = 1 // Setアドレスバー session_id
4: Cookie とセッションの関係
回答: session_id を保存して渡すにはCookie を使用します
Cookie が無効になっている場合、セッションは使用できますか?
回答: はい、第二に、JavaScript を使用してブラウザーがCookie をサポートし、ユーザーに Cookie を有効にするように促します。 5: セッションのデフォルトのライフサイクルは何ですか?
回答: ブラウザを閉じると無効になります。 理由: session_id が Cookie に存在し、デフォルトでは、ブラウザを閉じるとクッキーは失敗します
6: セッションのライフサイクルを 30 分に設定するにはどうすればよいですか?
答え: session.cookie_lifetime = 1800 php .ini を設定します
7: localhost/0415/set.php, set session,
すみません、このセッション値はどのパスで有効になりますか??
答え: session_id を渡すために使用された Cookie が有効になる場所はどこでも、セッションは有効になります
7.5 : session_id を渡す Cookie はどこで有効になりますか? A: デフォルトは「/」ディレクトリで有効になります
違い: Cookie はデフォルトで設定されたディレクトリで有効になり、セッションはデフォルトで / ディレクトリで有効になります
8: session_id を渡すように設定されている場合は Cookie の有効なパスですか?
答え: session.cookie_path = /、ここで設定できます



http://www.bkjia.com/PHPjc/885654.html

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/885654.html技術記事 PHP セッション制御: セッションと Cookie、sessioncookie の詳細説明 この記事では、PHP セッション制御について、主に次の点について説明します: セッション制御の背景と概念 Cookie のメンテナンスとライフサイクル...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。