セッションは、シンプルな方法で個々のユーザーのデータを格納する仕組みで、 個々のユーザーに対して一意なセッション ID を用意します。 これを用いて、複数ページにまたがるリクエストの間で状態の情報を永続させることができます。 セッション ID をブラウザに送信するときには、通常はセッションクッキーを利用します。 また、その ID を使って既存のセッションデータを取得します。 その ID やセッションクッキーが存在しなければ PHP に対して新たなセッションを作るよう伝え、 新たなセッション ID を生成します。
セッションの処理の流れは単純です。セッションを開始すると、 PHP はまず、(通常はセッションクッキーから受け取る) ID を使って既存のセッションを取得しようとします。 ID を受け取らなかった場合は新しいセッションを作成します。 セッションを開始すると、PHP はスーパーグローバル $_SESSION にすべてのセッションデータを格納します。PHP スクリプトの処理が終了するときには、 スーパーグローバル $_SESSION の中身を自動的に受け取ってシリアライズし、 ストレージに送信します。この一連の操作にはセッション保存ハンドラを使います。
デフォルトでは、PHP が使う保存ハンドラは files
です。これは
session.save_handler で設定します。
このハンドラは、サーバー上の
session.save_path で指定した場所にセッションデータを保存します。
セッションを手動で開始するには session_start() 関数を使います。
session.auto_start に
1
を設定している場合は、
リクエストの開始時に自動的にセッションを開始します。
通常は、PHP がスクリプトの処理を終了するときに、セッションは自動的に終了します。 手動でセッションを終了させるには session_write_close() 関数を使います。
例1 $_SESSIONで変数を登録
<?php
session_start();
if (!isset($_SESSION['count'])) {
$_SESSION['count'] = 0;
} else {
$_SESSION['count']++;
}
?>
例2 変数を $_SESSION から削除する
<?php
session_start();
unset($_SESSION['count']);
?>
unset($_SESSION)
によって
全ての$_SESSIONを初期化してはいけません。
$_SESSIONスーパーグローバル変数を用いた
セッション変数の登録ができなくなってしまうからです。
セッション変数において参照を使用することはできません。 他の変数への参照を復元する方法がないからです。
注意:
ファイルベースのセッション (PHP のデフォルト) は、 session_start() でオープンしたり session.auto_start で暗黙のうちに開始したりしたセッションのセッションファイルをロックします。 いったんロックがかかったら、そのスクリプトが終了するなり session_write_close() を呼んでセッションを閉じるなりしない限り、 他のスクリプトからはそのセッションファイルにアクセスできません。
これは、たとえば AJAX を使いまくっていて同時に複数のリクエストが発生したりするウェブサイトで問題になります。 この問題への対処方法として一番お手軽なのは、セッションに対して必要な変更が終わったらすぐに session_write_close() を呼ぶことです。スクリプトの最初のほうで呼ぶほうが好ましいでしょう。 あるいは、ファイルではなく別のバックエンド (同時アクセスに対応しているもの) を使うという手もあります。