Google

NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.7">

XCIIIセッション処理関数(session)

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.0.3以降、track_varsは常 に on となりました。

注意 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()を使用する必要はありません。

注意

$HTTP_SESSION_VARS/$_SESSION を使用し、register_globals を無効とする場合、 session_register(), session_is_registered(), session_unregister()を使用しないで下さい。

register_globals を有効にしている場合は、 session_unregister()を使用する必要があります。 これは、シリアル化されたセッションデータが戻される時にセッション 変数がグローバル変数として登録されるためです。 セキュリティ面と性能面の双方よりregister_globals を無効とすることが推奨されています。

例 4 register_globals が有効な場合に、変数を登録する

<?php
if (!session_is_registered('count')) {
    session_register("count");
    $count = 0;
}
else {
    $count++;
}
?>

track_varsregister_globals が共に有効な場合、グローバル変数と $HTTP_SESSION_VARS/$_SESSION エントリは登録済みの変数の同じ値を参照することになります。

ユーザがセッション変数を登録する際にsession_register()を使用する場合、 $HTTP_SESSION_VARS/$_SESSION は、セッションのストレージからロードされるまで(すなわち次のリクエ ストまで)配列内にこれらの変数を有しません。

セッションIDの通知を行うためには次の二つの方法があります。

  • クッキー

  • URLパラメータ

セッションモジュールは、両方の方法をサポートします。 クッキーは最適ですが、(クライアントがクッキーを受け入れない可能性が あるため)信頼性がなく、頼ることができません。二番目の方法は、 セッション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 でサポートされました。

目次
session_cache_expire -- カレントのキャッシュの有効期限を返す
session_cache_limiter -- カレントのキャッシュリミッタを取得または設定する
session_decode -- 文字列からセッションデータをデコードする
session_destroy -- セッションに登録されたデータを全て破棄する
session_encode --  現在のセッションデータを文字列としてエンコードする
session_get_cookie_params --  セッションクッキーのパラメータを得る
session_id -- カレントのセッションIDを取得または設定する
session_is_registered --  変数がセッションに登録されているかどうかを調べる
session_module_name -- 現在のセッションモジュールを取得または設定する
session_name -- カレントのセッション名を取得または設定する
session_readonly -- Begin session - reinitializes freezed variables, but no writeback on request end
session_register -- 現在のセッションに1つ以上の変数を登録する
session_save_path --  現在のセッションデータ保存パスを取得または設定する
session_set_cookie_params --  セッションクッキーパラメータを設定する
session_set_save_handler --  ユーザ定義のセッション保存関数を設定する
session_start -- セッションデータを初期化する
session_unregister -- 現在のセッションから変数の登録を削除する
session_unset --  全てのセッション変数を開放する
session_write_close -- セッションデータを書き込んでセッションを終了する