PHP のセッションサポート機能は、 複数回のアクセスを通じて特定のデータを保持する手段を 実現するものです。 これにより、よりカスタマイズされたアプリケーションを構築し、 自分の Web サイトのアピール度を増加させることが可能となります。
PHPLIB のセッション管理に精通している場合には、 そのコンセプトがPHP のセッションサポートに似ていることに気づくことでしょう。
Web サイトの訪問者にはセッションIDというユニークなIDが割りつけられます。 このIDは、ユーザー側にクッキーとして保存するか、または、URLに埋め込みます。
セッションサポート機能により、任意の数の変数をリクエスト間で受けわたせる ようになります。来訪者がサイトにアクセスした際、 PHP は特定のセッションIDがリクエストとともに送信されているかどうかを (session.auto_start が 1 の場合は)自動的に、または (session_start により明示的な、あるいは session_register により暗黙の) 要求を受けて確認します。 このIDが送信されている場合には、以前保存された変数が再現されます。
全ての登録された変数は、リクエストが終了した後に、シリアル化されます。 未定義の登録変数は、未定義であるとしてマーク付けされます。 後でユーザーがこれらの変数を定義しない限り、以降のアクセスにおいて セッションモジュールにより定義されません。
track_vars および gpc_globals の設定は、セッション変数を取得する方法に影響します。 track_vars を有効にした場合、取得されたセッション 変数はグローバル連想配列$HTTP_STATE_VARSとして利用可能になります。 gpc_globals が有効な場合、セッション変数は 対応するグローバル変数に取得されます。 これらの設定が共に有効な場合、グローバル変数と$HTTP_STATE_VARS エントリが同じ値を参照します。
セッションIDの通知を行うためには次の二つの方法があります。
クッキー
URL パラメータ
セッションモジュールは、両方の方法をサポートします。 クッキーは最適ですが、(クライアントがクッキーを受け入れない可能性が あるため)信頼性がなく、頼ることができません。二番目の方法は、 セッションIDを直接URLに埋め込みます。
PHP は、--enable-trans-sid を付けてコンパイルされた 場合にこの処理を透過的に行います。 このオプションを有効にした場合、相対 URI はセッションIDを有するように 自動的に変更されます。 もしくは、クライアントが適当なクッキーを送信しない場合に 定義される定数 SID を使用することができます。 SID は、session_name=session_id の形式または空の文字列です。
次の例は、変数の登録法および SID を用いて他のページに 正しくリンクする方法のデモです。
例 1. 単一のユーザーに関するヒット数を数える
<?php session_register("count"); $count++; ?> こんにちは、あなたがこのページに来たのは <? echo $count; ?> times.<p> 回目ですね。 <? # ユーザーがクッキーを使用不可としている場合は、セッションIDを # 保存する必要があります。 ?> 続けるには、 <A HREF="nextpage.php?<?=SID?>">ここをクリック</A> して下さい。
セッション情報をデータベースに保存する機能を実装するには、PHPコードと ユーザ関数 session_set_save_handler が必要です。 MySQL やその他のデータベースをサポートするように以下の関数を拡張しておく 必要があります。
例 2. session_set_save_handler の使用法
<?php function open ($save_path, $session_name) { echo "open ($save_path, $session_name)\n"; return true; } function close () { echo "close\n"; return true; } function read ($key) { echo "write ($key, $val)\n"; return "foo|i:1;"; } function write ($key, $val) { echo "write ($key, $val)\n"; return true; } function destroy ($key) return true; } function gc ($maxlifetime) { return true; } session_set_save_handler ("open", "close", "read", "write", "destroy", "gc"); session_start (); $foo++; ?>
上の例により、次のような結果が出力されます。
$ ./php save_handler.php Content-Type: text/html Set-cookie: PHPSESSID=f08b925af0ecb52bdd2de97d95cdbe6b open (/tmp, PHPSESSID) read (f08b925af0ecb52bdd2de97d95cdbe6b) write (f08b925af0ecb52bdd2de97d95cdbe6b, foo|i:2;) close
PHP のコンパイル時に --enable-trans-sid を付けた場合、 <?=SID?> は必要ありません。
セッション管理システムは、php.ini ファイルに記述可能な 多くの設定オプションをサポートします。 以下に概要を示します。
session.save_handler は、 セッションに関連するデータの保存および取得に使用される ハンドル名を定義します。デフォルトは、 filesです。
session.save_path は、保存ハンドラに渡される 引数を定義します。 デフォルトのファイルハンドラ選択した場合、 ファイルが作成される場所のパスになります。デフォルトは、 /tmp です。
session.name はセッション名を指定し、 クッキー名として使用されます。 アルファベット文字のみで指定する必要があります。 デフォルトは、PHPSESSID です。
session.auto_start はリクエスト開始時に セッションモジュールがセッションを自動的に開始するかどうかを 指定します。デフォルトは、 0 (無効) です。
session.lifetime は、ブラウザに送信する クッキーの有効期間を秒数で指定します。 値 0 は、"ブラウザを閉じるまで" を意味します。 デフォルトは、0 です。
session.serialize_handler は、 シリアル化またはシリアル化データを復元するために使用される ハンドラの名前を定義します。 現在、( phpという名前の)PHP 内部フォーマットおよび (wddxという名前の)WDDX がサポートされています。 WDDXは、PHP がWDDX サポート を有効にして コンパイルされている場合のみ使用可能です。 デフォルトは、php です。
session.gc_probability は、 gc (ガーベッジ・コレクション)ルーチンが各リクエストにおいて 開始される確率をパーセントで指定します。 デフォルトは、1 です。
session.gc_maxlifetime は、 データが'ごみ'とみなされてから消去されるまでの秒数を 指定します。
session.referer_check は、外部サイトによると 思われるセッションIDを消去するかどうかを定義します。 セッションIDをURLによる方法を用いて指定している場合、ユーザーは その影響を知らずにセッションIDを公開してしまうかもしれません。 これはセキュリティ上の問題と成り得るため、この確認を行うことにより 防止します。デフォルトは、0。
session.entropy_file は、 セッションIDを作成する際の別のエントロピソースとして使用する 外部リソースへのパスを指定します。 例としては、多くの UNIX で利用可能な /dev/random または /dev/urandom があげられます。
session.entropy_length は、前記のファイルから読みこむ バイト数を指定します。デフォルトは、0 (無効)です。
注意: セッション処理機能は、PHP 4.0 でサポートされました。