Soulak、Weiboから転載する際は明記してください: @evagle
以前は、セッションと Cookie についてまだ漠然としていました。今日、Yii フレームワークを使用しているときに、「session_regenerate_id(): Session object destroy failed」というエラーが発生したので、セッションの動作メカニズムをもう一度調べてみました。
W3Cschool からセッションの定義をインターセプトします:
アプリを実行するときは、アプリを開いて変更を加えてから閉じます。セッションによく似ています。コンピューターはあなたが誰であるかを知っています。ユーザーがアプリケーションをいつ開始し、いつ終了するかを認識します。しかし、インターネットには問題があります。サーバーはユーザーが誰で何をしているのかを知りません。これは、HTTP アドレスが状態を維持しないためです。
PHP セッションは、ユーザー情報 (ユーザー名、購入したアイテムなど) を後で使用できるようにサーバーに保存することで、この問題を解決します。ただし、セッション情報は一時的なものであり、ユーザーがサイトを離れると削除されます。情報を永続的に保存する必要がある場合は、データをデータベースに保存できます。
セッションは、訪問者ごとに一意の ID (UID) を作成し、この UID に基づいて変数を保存することで機能します。 UID は Cookie に保存されるか、URL を通じて渡されます。
まずセッションのライフサイクルを見てみましょう。これはセッションを理解するために非常に重要です。
1. セッションはいつ作成されますか?
簡単に言えば、セッションはユーザーが初めてサーバーにアクセスするときに作成されます。セッションはphp、jsp、aspなどのWeb言語によって作成されます。静的なHTMLページにアクセスする場合は作成されません。 。例としてphpを見てみましょう:
a) ユーザーがこの ID は一意であり、ユーザーごとに異なります。
b) このセッション ID は PHP の $_SESSION 変数に保存され、ユーザーのブラウザに Cookie を設定することもできます。
c) その後、ユーザーが Web サイトの他のページにジャンプするときは、この Cookie に保存されているセッション ID をブラウザーに伝えるだけで済み、サーバーはこのセッション ID に対応する保存された情報を取り出して、ユーザーが誰であるかを知ると、ユーザーのこの情報を別のページに表示することもできます。
d) セッションの作成後、ユーザーのショッピング カート内の商品情報の保存など、他のユーザー関連情報を保存できます。
e) セッションが生成された後、ユーザーがアクセスを続ける限り、サーバーはセッションの最終アクセス時刻を更新し、セッションを維持します。ユーザーがサーバーにアクセスするたびに、セッションの読み取りまたは書き込みに関係なく、サーバーはユーザーのセッションが「アクティブ」であるとみなします。
そのため、ユーザーが Web サイトにアクセスすると、通常は最初から最後まで同じセッションに参加します (セッションがあまりにも早く期限切れになる場合を除く)。どのように Web サイトにジャンプしても、セッションのコンテンツにアクセスできます。
PHP の session_id() 関数は、現在の session_id 情報を確認できます。 Web サイトには同時に多くのユーザーがアクセスできるため、PHP はユーザーごとに一意の session_id を生成します。各ユーザーは独立したプロセスによって処理されるため、これは相互に干渉しません。ユーザー A が配置されているプロセスは、セッションが期限切れになるまで A の session_id を保存します。
つまり、一般的にセッションはユーザーが Web サイトにログインするときに設定され、ユーザーがログアウトするときにセッションが閉じるかクリアされます (閉じるかクリアするかはビジネス ニーズによって異なります)。
2. セッションの有効期限はいつですか?
a) サーバーにアクセスするユーザーが増えるにつれて、セッションの数も増えます。メモリのオーバーフローを防ぐために、サーバーは長期間アクティブでなかったセッションをメモリから削除します。この時間はセッションのタイムアウト時間です。タイムアウト期間が経過してもサーバーにアクセスしない場合、セッションは自動的に期限切れになります。
b) Session の無効化メソッドを呼び出します。
参考: http://www.w3school.com.cn/php/php_sessions.asp
次に、一般的に使用される PHP セッション関連の関数がいくつかあります。
session_start — 新しいセッションを開始するか、既存のセッションを再開します セッションが開始します
session_id — 現在のセッション ID を取得および/または設定します セッション ID を取得します
session_status — 現在のセッション ステータスを返してセッション ステータスを取得します。ステータスは 3 つあります
PHP_SESSION_DISABLED
PHP_SESSION_DISABLED
if sessions are disabled.PHP_SESSION_NONE
if sessions are enabled, but none exists.PHP_SESSION_ACTIVE
セッションが無効の場合。PHP_SESSION_NONE
PHP_SESSION_ACTIVE
セッションが無効の場合有効になっており、1 つ存在します。
session_regenerate_id — 現在のセッション ID を新しく生成された ID で更新して、現在のセッションを再割り当てします
session_destroy — セッションに登録されているすべてのデータを破棄します セッション全体を完全に削除します
詳細については、http://www.php.net/manual/en/ref.session.phpを参照してください。