HTTPは、理由からステートレスプロトコルです。セッションは状態をHTTPに溶接します。経験則として、セッション状態の使用は避けてください。
更新:HTTPレベルでのセッションの概念はありません。サーバーは、クライアントに一意のIDを与え、要求ごとにそれを再送信するようにクライアントに指示することで、これを提供します。次に、サーバーはそのIDをSessionオブジェクトの大きなハッシュテーブルへのキーとして使用します。サーバーはリクエストを受け取るたびに、クライアントがリクエストで送信したIDに基づいて、セッションオブジェクトのハッシュテーブルからセッション情報を検索します。この余分な作業はすべて、スケーラビリティに対する二重の苦痛です(HTTPがステートレスである大きな理由)。
- Whammy One:単一のサーバーで実行できる作業が減ります。
- Whammy Two:リクエストを古いサーバーにルーティングするだけでは不十分なため、スケールアウトが難しくなります。すべてのサーバーが同じセッションを持っているわけではありません。特定のセッションIDを持つすべてのリクエストを同じサーバーに固定できます。これは簡単なことではなく、単一障害点です(システム全体ではなく、ユーザーの大部分にとって)。または、クラスター内のすべてのサーバー間でセッションストレージを共有することもできますが、ネットワーク接続メモリ、スタンドアロンセッションサーバーなど、より複雑になります。
これらすべてを考慮すると、セッションに入力する情報が多いほど、パフォーマンスへの影響は大きくなります(Vinkoが指摘しているように)。また、Vinkoが指摘しているように、オブジェクトがシリアル化できない場合、セッションは誤動作します。したがって、経験則として、セッションに絶対に必要なもの以上のものを入れることは避けてください。
@Vinko通常、追跡しているデータを返送する応答に埋め込み、クライアントに再送信させることで、サーバーストアの状態を回避できます。たとえば、非表示の入力でデータを送信します。サーバー側で状態を追跡する必要がある場合は、おそらくバッキングデータストアにあるはずです。
(Vinko氏は次のように付け加えています。PHPはセッション情報を保存するためにデータベースを使用できます。クライアントに毎回データを再送信させることで、潜在的なスケーラビリティの問題を解決できる可能性がありますが、クライアントがすべてを制御しているため、注意が必要なセキュリティ問題の大きな可能性があります。あなたの状態)