PHP マニュアル
前のページ |  | 次のページ

# 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_vars`と `register_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 でサポートされました。

前のページ | ホーム | 次のページ
sesam_settransaction | 上に戻る | session_cache_expire