PHPのセッションサポート機能は、複数回のアクセスを通じて特定のデータを保持する手段を実現するものです。
Web サイトの訪問者にはセッションIDというセッションIDと呼ばれるユニークなIDが割りつけられ ます。このIDは、ユーザー側にクッキーとして保存するか、または、URL に埋め込みます。
セッションサポート機能により、スーパーグローバル配列
$_SESSION
を使ってリクエスト間でデータを格納できるようになります。
来訪者がサイトにアクセスした際、
PHP は特定のセッションIDがリクエストとともに送信されているかどうかを
(
session.auto_startが1の場合は)自動的に、または
(session_start() により明示的な)
要求を受けて確認します。
このIDが送信されている場合には、以前保存された変数が再現されます。
session.auto_start をオンにした場合にオブジェクトをセッションに代入する唯一の方法は、 クラスの定義を auto_prepend_file でロードしておき、オブジェクトを serialize() したうえで後で unserialize() することです。
$_SESSION (およびそこに登録されたすべての変数) は、リクエストが終了したときに PHP が内部的にシリアライズします。 シリアライズの方式として、ini 設定 session.serialize_handler で指定したハンドラを使います。 未定義の登録変数は、未定義としてマーク付けされます。 これらの変数は、後でユーザーが定義しない限り、以降のアクセスにおいて セッションモジュールにより定義されません。
セッションデータはシリアライズされるので、 resource 型の変数はセッションに格納できません。
シリアライズハンドラ php と php_binary
は、$_SESSION の最上位のキーに制約を課します。
セッションに格納した配列やオブジェクトの中にネストしたキーは、この制約を受けません。
最上位のキーとして、次のものは使えません:
数値のキー (たとえば $_SESSION[0])。
このようなキーはセッションの書き込み時にスキップされ、警告が発生します。
| を含む文字列のキー
(シリアライズハンドラ php を使う場合)。
このようなキーを使うと、セッションの書き込みに失敗します
(PHP 8.5.0 以降では警告も発生します)。
php_serialize ハンドラには、これらの制約はありません。
数値のキーや | を含むキーを
$_SESSION の最上位に格納する必要がある場合、
このハンドラが使えます。
注意:
セッションを処理している時、 スーパーグローバル配列$_SESSION へ新しいキーを 追加して変数が登録されるまで、 セッションのレコードは作成されないことに注意してください。 これは、セッションが session_start() 関数により開始されている場合でも当てはまります。