CGI-Session-3.11 > CGI::Session

名前

CGI::Session - CGIアプリケーションにおける持続的なデータのセッション

概要

    # オブジェクトの初期化:
    use CGI::Session;

    my $session = new CGI::Session("driver:File", undef, {Directory=>'/tmp'});

    # 有効なセッションIDを取得
    my $CGISESSID = $session->id();

    # セッションにデータを格納
    $session->param('f_name', 'Sherzod');
    # or
    $session->param(-name=>'l_name', -value=>'Ruzmetov');

    # データの回収
    my $f_name = $session->param('f_name');
    # または
    my $l_name = $session->param(-name=>'l_name');

    # 特定セッションパラメータのクリア
    $session->clear(["_IS_LOGGED_IN"]);

    # '_IS_LOGGED_IN'フラグは10分間アイドルした後期限切れになります
    $session->expire(_IS_LOGGED_IN => '+10m');

    # セッションそのものが1時間アイドルした後期限切れになります
    $session->expire('+1h');

    # セッションを削除したほうが良いでしょう
    $session->delete();

説明

CGI-SessionはHTTPリクエストを介した簡潔で、信頼性のあるモジュール方式の セッション管理システムを提供するPerl5のライブラリです。 持続性はショッピングカートや、ログイン/認証ルーチン、 HTTPリクエストを介してデータを持ち運ぶ操作が必要なアプリケーション と言ったものについての未来を左右します。CGI::Sessionではそれを行うと共に、 それ以上の多くのことも行います。

より深く学ぶには

現在のマニュアルはクイックリファレンスとして活用されています。 セッション管理の背後にあるロジックとCGI::Sessionのプログラミングスタイルに の両方についてより深く学ぶためには以下を参考にして下さい:

  • CGI::Session::Tutorial - CGI::Sessionに関して 広範囲に記述されたマニュアルです。ライブラリの構成やドライバの特性についての 説明を含んでいます。

  • CGI::Session::CookBook - 実生活での問題に対する 実用的な解決法

  • 我々はCGI::Session usersのためのメーリングリストも提供しています。 メーリングリストを購読する、あるいはアーカイブを閲覧するためには https://lists.sourceforge.net/lists/listinfo/cgi-session-user を訪れて下さい。

  • RFC 2965 - "HTTP State Management Mechanism"は ftp://ftp.isi.edu/in-notes/rfc2965.txt で見付かります。

  • CGI - 標準CGIライブラリ

  • Apache::Session - CGI::Sessionに対するもう一つの素晴らしい選択肢

メソッド

以下はCGI::Sessionオブジェクト経由で使用可能な全メソッドの概要です。

new( DSN, SID, HASHREF )

3つの引数を要求します。1つ目がデータソースの名前、2つ目が初期化されるため のセッションid、あるいは'param()'か'cookie()'メソッドのいずれかを提供する オブジェクトでなくてはなりません。もしデータソースの名前がundefであれば、 デフォルト値である"driver:File;serializer:Default;id:MD5"となります。

セッションidが空の場合、強制的にライブラリに新しいセッションidを 生成させるのですが、おそらくアクセス可能なid()メソッドが用いられる ことでしょう。

例:

    $session = new CGI::Session(undef, undef, {Directory=>'/tmp'});
    $session = new CGI::Session("driver:File;serializer:Storable", undef,  {Directory=>'/tmp'})
    $session = new CGI::Session("driver:MySQL;id:Incr", undef, {Handle=>$dbh});

以下のデータソース変数がサポートされています。

  • driver - CGI::Session のドライバです。使用可能なドライバは"File", "DB_File"及び"MySQL"です。デフォルトは"File"です。

  • serializer - シリアライザはデータをディスクに保存する前に、データ構造を エンコードするために用いられます。使用可能なシリアライザは"Storable"、 "FreezeThaw"及び"Default"です。デフォルトで使われる"Default"は、 標準のData::Dumperを用います。

  • id - 新しいセッションが作成される際に用いられるIDジェネレータです。 IDジェネレータは"MD5"と"Incr"です。デフォルトは"MD5"となっています。

Note: DSNのパラメータの明瞭な省略記法を用いることも可能です。例:

    new CGI::Session("dr:File;ser:Storable", undef, {Diretory=>'/tmp'});
id()

セッションのための有効なIDを返します。有効なIDと要求されたIDが異なる 可能性もあるため、有効なセッションidはこのメソッドを用いることで いつも解決すべきです。

param($name)
param(-name=>$name)

このメソッドは$nameにセットしたセッションパラメータを 返すために上記におけるいずれかの文法で用いられます。

param( $name, $value)
param(-name=>$name, -value=>$value)

$nameパラメータに対して新しい値を割り当るために上記の文法のいずれかで 用いられるメソッドで、先程紹介したparam()の文法によって後から値を取得 することが可能です。

param_hashref()

全セッションパラメータをハッシュへのリファレンスとして返します。

save_param($cgi)
save_param($cgi, $arrayref)

CGIパラメータをセッションオブジェクトに保存します。言い替えれば、 param($name, $value)を単一のCGIパラメータ全てに対して呼び出すことと 言えます。1つ目の引数はCGIオブジェクトであるか、又はparam()メソッドを 提供することのできるオブジェクトならばどんなものでも構いません。もし2つ目の 引数が与えられ、それが配列へのリファレンスであるならば、配列中の中で見付けた CGIパラメータのみがセッション中に格納されるでしょう。

load_param($cgi)
load_param($cgi, $arrayref)

CGIオブジェクトにパラメータをロードします。最初の引数はCGI.pmオブジェクトが 入るか、あるいはparam()メソッドを提供できるオブジェクトであれば どんなものでも構いません。もし2つ目の引数が与えられ、それが配列への リファレンスであれば、その配列中で見付かったパラメータのみをCGIオブジェクトへ ロードします。

sync_param($cgi)
sync_param($cgi, $arrayref)

試験的な形式です。CGIオブジェクトとsessionオブジェクトを同期させます。 言い替えればsave_param()及びload_param()のそれぞれの文法を呼び出すことと 同じです。

clear()
clear([@list])

セッションオブジェクトからパラメータをクリアします。もし配列の リファレンスとして引数が渡された場合、リスト内に見付かった パラメータのみをクリアします。

flush()

バッファ内のデータをディスク内のそのコピーに同期させます。通常は プログラムが終了する直前にあなたが呼び出し、sessionオブジェクトは スコープから外れるか、あるいはclose()が呼び出されることになるでしょう。

close()

同じセッションで次ぎにnew()が呼び出されるまでsessionを一時的にクローズし、 flush()及びDESTROY()を呼び出しますが、とても遅いです。 通常であれば、けしてclose()を呼び出すべきないでしょう。

atime()

セッションが最後にアクセスされた時間を新紀元からの秒数の形式で返します。 この時間は自動的に期限切れになるセッション又はセッションのパラメータあるいは その両方で内部的に使用されます。

ctime()

最初に生成された際の時刻を返します。

expire()
expire($time)
expire($param, $time)

atime()に関連する有効期限を表す日付をセットします。もし全く引数が使われていない 場合、既に有効期限を表す日付がセットされている場合はその日付を返します。 もしまだ有効期限が設定されていない場合は、undefを返します。

2つ目は時刻で有効期限を設定する形式です。この値は以前に格納されたセッションが データを取得するために尋ねられ、もし有効期限の日付を過ぎていた場合ディスクから 直ちに消去され、それに応じて新しいセッションが作られます。0を渡すことで 有効期限の日付をキャンセルすることができるでしょう。

3つ目の文法を用いることによっても"~logged-in"と言った適切なセッション パラメータを渡すことで有効期限を設定することが可能です。これによって ライブラリはタイムアップになった際にパラメータに対してclear()を呼び出すように なります。

全ての時間に関する値は秒数の形式で与えられるべきです。しかし、以下の時間に 関する別名もあなたの利便性のためにサポートされています:

    +===========+===============+
    |   別名    |     意味      |
    +===========+===============+
    |     s     |      秒       |
    |     m     |      分       |
    |     h     |      時       |
    |     w     |      週       |
    |     M     |      月       |
    |     y     |      年       |
    +-----------+---------------+

例:

    $session->expire("+1y");   # 1年を有効期限とします
    $session->expire(0);       # 有効期限をキャンセルします
    $session->expire("~logged-in", "+10m");# ~logged-inフラグを10分有効にします

Note: 全ての有効期限はセッションの最終アクセス時間に関するものであって、 作成された時間ではありません。ただちにセッションを期限切れにするには delete()を呼び出して下さい。特定のセッションパラメータをすぐに期限切れに するにはそのパラメータに対してclear()を呼び出して下さい。

remote_addr()

最初にセッションを作成したユーザーのリモートアドレスを返します。 セッション作成時に環境変数REMOTE_ADDRが提供されなかった場合は undefを返します。

delete()

ディスクからセッションを削除します。言い替えれば、直ちに期限切れにして 後からアクアスできないようにすると言うことです。

error()

ライブラリからの最後のエラーメッセージを返します。$CGI::Session::errstrの 値と同じです。例:

    $session->flush() or die $session->error();
dump()
dump("file.txt")
dump("file.txt", 1)
dump("file.txt", 1, 2)

セッションオブジェクトのダンプを作成します。1つ目の引数ですが、 渡された場合、ダンプが書き出されるべきファイル名として解釈されます。 2つ目の引数ですが、もしtrueであれば、_DATAテーブルにのみダンプを 作成します。このテーブルはファイルに格納されたセッションデータのみを 含んでいます。言い替えれば、dump()はランタイム属性、言い加えると_DATAを 含むオブジェクト全体のダンプを返します。

3つ目の引数に渡せるのは0から3までの間です。ダンプのインデントを表示するのに 用います。デフォルトは2です。

header()

header()は単にCGI.pmのheader()に代るメソッドです。このメソッドを 用いない場合、あなたはCGI::Cookieオブジェクトを作成し、HTTP headerの一部に 送信する必要があります:

    $cookie = new CGI::Cookie(-name=>'CGISESSID', -value=>$session->id);
    print $cgi->header(-cookie=>$cookie);

上記を最小限にまとめることが可能です:

    $session->header()

$CGI::Session::NAME変数からセッションのクッキー名を取得し、 CGI::Session->name()メソッド経由でもアクセスすることが可能になるでしょう。 もしセッションのクッキーに異なる名前を使用したい場合は、sessionオブジェクトを 次のように作成して下さい:

    CGI::Session->name("MY_SID");
    $session = new CGI::Session(undef, $cgi, \%attrs);

すると、$session->header()は"MY_SID"をセッションのクッキー名として扱います。

データテーブル

セッションデータはハッシュテーブル、つまりキー/値のペアの形式で格納されて います。あなたがparam()メソッドを通して割り当てたパラメーター名は テーブル内のキーとなり、あなたが割り当てた値はどれでもそのキーによって 連想されるのです。全てのキー/値のペアはレコードとも呼ばれます。

param()メソッドを通して保存した全てのデータは公開レコードと呼ばれます。 同様に読み込み専用の非公開レコードも存在します。通常、あなたは ライブラリを使用するにあたってそれらについて何も知らなくても構いません。 かと言って、知ることで傷つくと言うこともありません。ここにあるのはプライベート レコードのリスト及び所有している内容に関する説明です。

_SESSION_ID

そのデータに対するセッションidです。id()メソッドを通してアクセスできます。

_SESSION_CTIME

セッション作成時刻です。ctime()メソッドを通してアクセスできます。

_SESSION_ATIME

セッションの最終アクセス時刻です。atime()メソッドを通すことでアクセスできます。

_SESSION_ETIME

もしあれば、セッションの有効期限を示します。expire()メソッドを通してアクセス できます。

_SESSION_REMOTE_ADDR

そのセッションを作成したユーザーのIPアドレスです。remote_addr()メソッドを通して アクセスできます。

_SESSION_EXPIRE_LIST

もしあれば、それぞれの有効期限付き公開レコードに関する有効期限の情報を入れた もう一つの内部的なハッシュテーブルとなります。このテーブルは2つの引数を持つ 方のexpires()メソッドの文法を用いることによって更新されます。

これらのプライベートメソッドはライブラリがセッションデータを抱えて稼働中、 適切な操作を行うために欠かせないものです。この原則のため、CGI::Sessionは これらのメソッドのどれもがparam()メソッド経由で上書きすることを 許していません。言い加えると、将来名前が衝突するのを阻止するために_SESSION_ と言う文字列で始まるパラメータ名は許されていないのです。

よって以下の試みはいかなるセッションデータにも影響を与えることはないでしょう。

    $session->param(_SESSION_XYZ => 'xyz');

プライベートメソッドが書き込み可能でないのに対して、ライブラリはparam()メソッド を用いることによってそれらを読み出すことを許しています:

    my $sid = $session->param(_SESSION_ID);

上記と同じものとして:

    my $sid = $session->id();

しかし我々はparam()メソッドを用いてプライベートレコードにアクセスできない からと言って嘆くことはありません。将来我々は名前の衝突を回避し、 セッションパラメータ名の制約を取り除くためにプライベートレコードを 自身の名前空間に格納する計画をたてています。

ディストリビューション

CGI::Sessionはいくつかのdirversserializers 及びid generatorsのようなモジュール方式のコンポーネント から構成されます。このセクションでは使用可能なものについてリストしています。

ドライバ

以下は標準ディストリビューションに含まれるドライバです:

  • File - セッションデータをファイルにそのまま格納する デフォルトのドライバです。フルネーム: CGI::Session::File

  • DB_File - BerkelyDBにセッションデータを格納するため のドライバです。DB_Fileを必要とします。フルネーム: CGI::Session::DB_File

  • MySQL - MySQLのテーブルにセッションデータを格納する ためのドライバです。DBI及びDBD::mysqlを必要とします。 フルネーム: CGI::Session::MySQL

シリアライザ

  • Default - デフォルトのデータシリアライザ です。標準のData:Dumper|Data::Dumperを使用します。 フルネーム: CGI::Session::Serialize::Default

  • Storable - Storableを使いデータを シリアライズ化します。Storableを必要とします。フルネーム: CGI::Session::Serialize::Storable

  • FreezeThaw - FreezeThawを使って データをシリアライズ化します。FreezeThawを必要とします。 フルネーム: CGI::Session::Serialize::FreezeThaw

IDジェネレータ

以下は使用可能なIDジェネレータです:

  • MD5 - 32文字の長さの16進数の文字列を生成します。 Digest::MD5を必要とします。フルネーム: CGI::Session::ID::MD5

  • Incr - 自動的にインクリメントされるidを生成します。 フルネーム: CGI::Session::ID::Incr

  • Static - 静的にセッションidを生成します。 CGI::Session::ID::Static

クレジット

以下はCGI::Sessionの開発に対してパッチを提供したり、提案を出したりして 貢献してくれた方々です。貢献して頂いた時期の順に並べています:

Andy Lester <alester@flr.follett.com>
Brian King <mrbbking@mac.com>
Olivier Dragon <dragon@shadnet.shad.ca>
Adam Jacob <adam@sysadminsith.org>

著作権

Copyright (C) 2001, 2002 Sherzod Ruzmetov <sherzodr@cpan.org>. All rights reserved.

This library is free software. You can modify and or distribute it under the same terms as Perl itself.

作者

Sherzod Ruzmetov <sherzodr@cpan.org>. 感想や意見を歓迎します。

参考文献

  • CGI::Session::Tutorial - さらに幅広く記述された CGI::Sessionのマニュアル

  • CGI::Session::CookBook - 実生活のための実用的な解決方法

  • RFC 2965 - "HTTP State Management Mechanism"は ftp://ftp.isi.edu/in-notes/rfc2965.txt で見付かります。

  • CGI - 標準CGIライブラリ

  • Apache::Session - CGI::Sessionに対するもう一つの素晴らしい選択肢

翻訳者

三浦真磁 <snj@users.sourceforge.jp>