Session の存在意義は、Web 開発に携わっている人であれば理解していると思いますが、HTTP がステートレス プロトコルであるために生じる問題を解決するためのものなので、詳細は説明しません。ここで話したい主な点は、サーバーとクライアントがセッションを使用してどのように対話するかということです。
まず以下のフローチャートを見てください:
ユーザーが初めてサイトにアクセスすると、PHP は session_start() 関数を使用してユーザーのセッション ID を作成します。これは、訪問する各ユーザーに固有のセッション ID を取得します。 ID は応答ヘッダーの Cookie に保存され、クライアントに送信されます。このようにして、クライアントはサイトから与えられたセッション ID を取得します。
ユーザーがサイトに 2 回目にアクセスすると、ブラウザはローカルに保存されている Cookie (前回取得したセッション ID を含む) をリクエストとともにサーバーに送信します。リクエストを受信した後、サーバーはリクエストが存在するかどうかを検出します。セッション ID が存在する場合は、対応するセッション ファイルが検索され、存在しない場合は、最初と同様に新しいセッション ファイルが作成されます。
通常、サイトの終了関数は、実際には session_destroy() 関数を呼び出し (より複雑な場合があります)、ユーザーのセッション ファイルを削除し、ユーザーの Cookie をクリアします。この方法では、クライアントとサーバーの間に接触はありません。
写真の赤いボックスは完全な HTTP リクエストです。HTTP はステートレスであるため、リクエストが完了すると、クライアントとサーバーには関係がなくなり、誰もお互いを知りません。ただし、一部のニーズ (ログイン状態の維持など) により、サーバーとクライアントの接続を維持する必要があり、セッション ID がこの接続の媒体になります。
上記の分析により、セッションが実際に Cookie に依存していることがわかります。ユーザーが特定のサイトにアクセスすると、ブラウザーはユーザーがアクセスしたサイトに基づいて利用可能な Cookie を自動的に検索し、利用可能な Cookie がある場合は送信されます。サーバーで。サーバーからの応答を受信するたびに、ローカル Cookie 情報が更新されます。
もちろん、GET を使用してセッション ID を渡すこともできますが、GET は安全ではないためお勧めしません。
上記のフローチャートからわかるように、サーバーは実際にセッション ファイルに生成されたデータの一部を保存します。ファイルの名前は「sess」にセッション ID を加えたものです。これらのファイルの保存場所は phpinfo() です。見つかった session.savepath の値。
上の図から、サーバーとクライアントが同じセッション ID 情報を保存していることが明確にわかります。これが、両者の接続を維持するための鍵です。
セッションによってもたらされる主な問題は、数千万人のユーザーがいる Web サイトの場合、各ユーザーがセッション ファイルにアクセスするたびにパフォーマンスに影響を与えることであると想像できます。対応するセッション ファイルはシステム リソースを大量に消費します。したがって、現時点では、サブディレクトリやハッシュなど、セッションストレージ用にいくつかのカスタム設定を行う必要があります。セッションファイルに保存するだけでなく、PHP に付属のセッション機能を放棄して自分でセッションを実装し、データベースにセッション情報を保存することもできます。このように、データベースのキャッシュを設定するのが最適です。そうしないと、数千万のデータが頻繁に取得され、大量のリソースが消費されます。
クライアントとサーバー間のこの接続は時間制限がある必要があるため、セッションを定期的にクリアする必要があります。この問題は 2 つの側面で考慮する必要があります。1 つはサーバー側のセッション ファイルをクリアすること、もう 1 つはクライアントの Cookie 情報をクリアすることです。これは、どちらも情報の半分を保存するためです。
PHP GC プロセスは、セッション ストレージ ディレクトリをスキャンしてセッション ファイルをクリアできますが、このプロセスは特にリソースを消費するため、PHP はセッションの開始時に期限切れのセッションをクリーンアップする確率が 1% にデフォルト設定されているため、それが意味するわけではありません。ユーザー セッションの有効期限が切れた場合、対応するセッション ファイルはすぐに消去されますが、99% の確率で消去されません。これには、私たちプログラマーが自分で行う必要があります。セッション情報に有効期限を保存できます。その値はユーザーの最終アクセス時刻になります。ユーザーがアクセスすると、最終アクセス時刻から現在の時刻が減算され、タイムアウトになるかどうかが確認されます。タイムアウトになると、対応するセッション ファイルが削除され、Cookie の Expires 属性が負の値に設定されます。これにより、クライアント側のCookie情報も有効期限が切れるとブラウザ上で自動的に削除されます。