XLIX. セッション処理関数

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 でサポートされました。

目次
session_start ? セッションデータを初期化する
session_destroy ? セッションに登録されたデータを全て破棄する
session_name ? 現在のセッション名を取得または設定する
session_module_name ? 現在のセッションモジュールを取得または設定する
session_save_path ? 現在のセッションデータ保存パスを取得または設定する
session_id ? 現在のセッションIDを取得または設定する
session_register ? 現在のセッションに1つ以上の変数を登録する
session_unregister ? 現在のセッションから変数の登録を削除する
session_is_registered ? 変数がセッションに登録されているかどうかを調べる
session_decode ? 文字列からセッションデータをデコードする
session_encode ? 現在のセッションデータを文字列としてエンコードする