PHPのセッションサポート機能は、複数回のアクセスを通じて特定のデー
タを保持する手段を実現するものです。これにより、よりカスタマイズさ
れたアプリケーションを構築し、自分の Web サイトのアピール度を増加
させることが可能となります。
PHPLIB のセッション管理に精通している場合には、そのコンセプトがPHPの
セッションサポートに似ていることに気づくことでしょう。
Web サイトの訪問者にはセッションIDというユニークなIDが割りつけられ
ます。このIDは、ユーザー側にクッキーとして保存するか、または、URL
に埋め込みます。
セッションサポート機能により、任意の数の変数をリクエスト間で受けわたせる
ようになります。来訪者がサイトにアクセスした際、
PHP は特定のセッションIDがリクエストとともに送信されているかどうかを
(session.auto_start が 1 の場合は)自動的に、または
(session_start() により明示的な、あるいは
session_register() により暗黙の)
要求を受けて確認します。
このIDが送信されている場合には、以前保存された変数が再現されます。
全ての登録された変数は、リクエストが終了した後に、シリアル化されます。
未定義の登録変数は、未定義としてマーク付けされます。
後でユーザーがこれらの変数を定義しない限り、以降のアクセスにおいて
セッションモジュールにより定義されません。
設定ファイルの設定値
track_vars
および register_globals
によりセッション変数の回復方法を指定します。
注意
PHP 4.1.0以降、$_SESSIONは、$_POST, $_GET, $_REQUEST等のようにグ
ローバル変数として利用可能です。$HTTP_SESSION_VARSと異なり、
$_SESSIONは常にグローバルです。そこで、
globalは$_SESSIONの場合は不要です。
track_vars
が有効で
register_globals
が無効の場合、グローバル変数配列$HTTP_SESSION_VARSのメンバーのみを
セッション変数として登録可能です。回復されたセッション変数は配列
$HTTP_SESSION_VARSでのみ利用可能です。
例 1
track_vars
が有効な時に変数を登録する
<?php
session_start();
if (isset($HTTP_SESSION_VARS['count'])) {
$HTTP_SESSION_VARS['count']++;
}
else {
$HTTP_SESSION_VARS['count'] = 0;
}
?> |
|
セキュリティとコードの可読性のために$_SESSION(またはPHP 4.0.6以前
は$HTTP_SESSION_VARS)の使用が推奨されます。$_SESSIONまたは
$HTTP_SESSION_VARSの場合、
session_register()/session_unregister()/session_is_registered()は
不要です。ユーザは、通常の変数と同様にセッション変数にアクセス可能
です。
例 2
$_SESSIONで変数を登録
<?php
session_start();
// PHP 4.0.6以前の場合は$HTTP_SESSION_VARSを使用して下さい
if (!isset($_SESSION['count'])) {
$_SESSION['count'] = 0;
}
else {
$_SESSION['count']++;
?> |
|
例 3$_SESSIONで変数の登録を解除する <?php
session_start();
// PHP 4.0.6以前の場合は$HTTP_SESSION_VARSを使用して下さい
unset($_SESSION['count']);
?> |
|
register_globals
が有効な場合、全てのグローバル変数はセッション変数として登録するこ
とが可能で、セッション変数は対応するグローバル変数として回復されま
す。PHPは、どのグローバル変数がセッション変数として登録されるのか
を知る必要があるため、ユーザは、変数をsession_register()関数で登録
する必要があります。しかし、
$HTTP_SESSION_VARS/$_SESSION
の場合は、session_register()を使用する必要はありません。
例 4
register_globals
が有効な場合に、変数を登録する
<?php
if (!session_is_registered('count')) {
session_register("count");
$count = 0;
}
else {
$count++;
}
?> |
|
track_varsと
register_globals
が共に有効な場合、グローバル変数と
$HTTP_SESSION_VARS/$_SESSION
エントリは登録済みの変数の同じ値を参照することになります。
ユーザがセッション変数を登録する際にsession_register()を使用する場合、
$HTTP_SESSION_VARS/$_SESSION
は、セッションのストレージからロードされるまで(すなわち次のリクエ
ストまで)配列内にこれらの変数を有しません。
セッションIDの通知を行うためには次の二つの方法があります。
セッションモジュールは、両方の方法をサポートします。
クッキーは最適ですが、(クライアントがクッキーを受け入れない可能性が
あるため)信頼性がなく、頼ることができません。二番目の方法は、
セッションIDを直接URLに埋め込みます。
PHP は、
--enable-trans-sidを付けてコンパイルされた
場合にこの処理を透過的に行います。
このオプションを有効にした場合、相対 URI はセッションIDを有するように
自動的に変更されます。
もしくは、クライアントが適当なクッキーを送信しない場合に
定義される定数 SID を使用することができます。
SID は、session_name=session_id
の形式または空の文字列です。
次の例は、変数の登録法および SID を用いて他のページに正しくリンク
する方法のデモです。
例 5単一のユーザーに関するヒット数を数える <?php
if (!session_is_registered('count')) {
session_register('count');
$count = 1;
}
else {
$count++;
}
?>
こんにちは、あなたがこのページに来たのは<?php echo $count; ?>回目ですね。 <p>
<?php
# ユーザーがクッキーを使用不可としている場合は、セッションIDを
# 保持するために<?php echo SID?> (short tagを有効としている場合は
# <?=SID?>も使用可能です)が必要です。
?>
続けるには、<A HREF="nextpage.php?<?php echo SID?>">ここをクリック</A>して下さい。 |
|
PHPのコンパイル時に
--enable-trans-sidを指定した場合には、
<?php echo SID?> は必要ありません。
注意
相対URLでないURLは、外部サイトを指していると仮定されSIDが追加
されません。これは、SIDを異なったサーバにもらすことはセキュリティ
上のリスクとなるためです。
セッション情報をデータベースに保存する機能か他の保存法を実装するに
は、一連のユーザレベルの保存関数を作成し、
session_set_save_handler()を使用する必要があり
ます。
セッション管理システムは、php.ini ファイルに記述可能な多くの設定オ
プションをサポートします。以下に概要を示します。
session.save_handler は、セッションに関連す
るデータの保存および取得に使用されるハンドル名を定義します。デ
フォルトは、filesです。
session.save_path は、保存ハンドラに渡される
引数を定義します。デフォルトのファイルハンドラ選択した場合、
ファイルが作成される場所のパスになります。デフォルトは、
/tmp です。
session.save_pathのパスの深さが2より大きい場
合、ガーベッジコレクションは行われません。
警告 |
この設定を/tmp (デフォルト)のようにどこか
らでも読み込み可能なディレクトリのままにしている場合、サーバ上
の他のユーザがこのディレクトリのファイルのリストを取得すること
により、セッションをハイジャックをすることが可能となります。
|
session.name はセッション名を指定し、
クッキー名として使用されます。
アルファベット文字のみで指定する必要があります。
デフォルトは、PHPSESSID です。
session.auto_start はリクエスト開始時に
セッションモジュールがセッションを自動的に開始するかどうかを
指定します。デフォルトは、0(無効)です。
session.cookie_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 には、HTTP Referer に
おいて確認を行う文字列を指定します。Refererがクライアントにより
送信されており、かつ、指定した文字列が見付からない場合、埋め込
まれたセッションIDは無効となります。デフォルトは空の文字列です。
session.entropy_file は、
セッションIDを作成する際の別のエントロピソースとして使用する
外部リソースへのパスを指定します。
例としては、多くの UNIX で利用可能な /dev/random
または /dev/urandom があげられます。
session.entropy_length は、前記のファイルから読みこむ
バイト数を指定します。デフォルトは、0 (無効)です。
session.use_cookiesによりクライアント側にセッションID
を保存する際にクッキーを使用するかどうかを指定します。デフォルトは
1 (有効)です。
session.cookie_pathによりsession_cokkieで設定する
パスを指定します。デフォルトは/です。
session.cookie_domainによりsession_cookieで指定する
ドメインを指定します。デフォルトでは指定されません。
session.cache_limiterにより
セッションページにおけるキャッシュ制御の方法(nocache/private/public)
を指定します。デフォルトは、nocacheです。
session.cache_expireによりキャッシュされた
セッションページの生存期間を分単位で指定します。
このオプションは、nocacheリミッタに関しては効果がありません。
デフォルトは、180です。
session.use_trans_sidは、
--enable-trans-sidを指定してコンパイ
ルを行うことにより有効となった場合に、透過的なセッション
IDの付加をするかどうかを指定します。
デフォルトは、1(有効)です。
url_rewriter.tagsは、透過的なセッションIDの
付加機能が有効となった場合に、セッションIDを含めるために書き換
えられるHTMLタグを指定します。デフォルトは、
a=href,area=href,frame=src,input=src,form=fakeentry
です。
注意
セッション処理機能は、PHP 4.0 でサポートされました。