CGIのセッションデータを保持するための簡易なモジュールです。
Walrus::Session::Liteモジュールでは、データの保存先はファイルに限られ、できることはセッションIDの生成と、ハッシュデータの保持だけです。 その代わり、Walrus::Session::Liteはどんな環境でも動き、簡単にCGIと一緒に配布できることを目指して作成されています。 Walrus::Session::Lite自身はPure Perlモジュールで、必要とする外部のライブラリ/モジュールはやはりPure PerlのDigest::Perl::MD5.pmのみです。
以下のURLから取得して下さい。
このファイルはWalrus::Session::Liteモジュールと、それからDigest::Perl::MD5.pmを含んでいます。 従って、このファイルを展開すると、WalrusとDigestというディレクトリが作られますので、この2つをモジュールの検索対象になるディレクトリに置くだけで使用できます。
あらかじめ、セッションデータを保存するためのディレクトリを作っておいて下さい。 以下では、"./session/"がセッションデータ保存用だとします。
スクリプト中では、はじめにWalrus::Session::Liteをロードしておきます。 また、セッションデータに結び付けるためのハッシュを作成しておきます。 セッションデータ保存用のディレクトリも、何らかの変数に設定しておくと、後でディレクトリを変更したくなった時などには便利です。
use Walrus::Session::Lite; my %session; my $session_dir = "./session/";
新しいセッションを立ちあげる時には、以下の様にしてハッシュとWalrus::Session::Liteを結び付けます。
tie(%session, 'Walrus::Session::Lite', $session_dir);
後は通常のハッシュのように、適当なキーと値を設定したり、削除して下さい。
なお、特別なキーとして "_session_id" があります。 これには今回生成されたセッションIDが保持されており、変更したり削除することはできません。 通常のハッシュ値と同じ扱いですので、次のようにすればセッションIDを知ることができます。
my $session_id = $session{'_session_id'};
過去のセッションを呼び出したい時には、Walrus::Session::Liteを結び付ける時に、そのセッションIDを指定します。
tie(%session, 'Walrus::Session::Lite', $session_dir, $session_id);
セッションのデータは、スクリプトの終了時か、ハッシュをuntieした時に自動的にファイルに保存されます。 ファイルを保存したくないとき、あるいは既存のセッションデータファイルを削除したい時は、下のようにdeleteメソッドを呼び出します。
tied(%session)->delete;
セッションデータファイルは、適宜削除しない限り、いくつでもたまり続けていきます。 CGIの機能上はそれほど影響のない話ですが、ディスク領域を圧迫される、レスポンスが悪くなるなどの影響は将来的に出ることがあるでしょう。 これらのファイルは、できるだけ適当な時点で要不要を判断し、消してよいものは消すにこしたことはないでしょう。
以下のようにlist_session_idメソッドを使用すると、現在保存されているすべてのセッションのIDを調べることができます。 これでセッションIDを取得し、各セッションIDの内容を確認して、不要であればdeleteメソッドを呼び出すのが一つの整理方法でしょう。
my @ID = tied(%session)->list_session_id;
あるいは、以下のようにlist_session_filesメソッドで、現在保存されているファイルのパスを取得することもできます。 直接ファイルを調べ、unlinkコマンドで不要ファイルを削除していくこともできます。
my @files = tied(%session)->list_session_files;
あるいは、より直接的に、指定期間内に更新のなかったセッションのデータファイルを一括して削除するためのメソッドもあります。 以下のようにdelete_expiredメソッドを使用します。
my $result = tied(%session)->delete_expired(3 * 24 * 60 * 60); # 3日以上更新のないセッションは破棄
なお、セッションが読み込まれただけでは更新がかからないので、アクセスされたばかりのセッションが期限切れで削除されてしまう、ということも起こりえます。 これを避けるには、適当な(例えば'_touch_time'などの)データを毎回登録してやればよいでしょう。
Walrus::Session::LiteモジュールのPOD文書に含まれているものです。
use Data::Dumper;
use Walrus::Session::Lite;
print "[ tie ]\n";
my %session;
my $session_obj = tie(%session, 'Walrus::Session::Lite', './');
my $session_id = $session{'_session_id'};
$session{'sex'} = 'male';
$session{'name'} = ['Makio', 'Tsukamoto'];
$session{'birthday'} = {
'year' => 1975,
'month' => 1,
'day' => 9
};
print Dumper(\%session);
print "\n[ untie ]\n";
untie %session;
print Dumper(\%session);
print "\n[ tie again ]\n";
$session_obj = tie(%session, 'Walrus::Session::Lite', './', $session_id);
print Dumper(\%session);
print "\n[ remove file ]\n";
tied(%session)->delete;
printf(qq("%s" removed.\n), tied(%session)->{'data_file'});
セッション管理はある程度以上の規模のCGIを作成する上では非常に便利で、不可欠に近く、当然そのためのモジュールも既に多くあります。 代表的なものには、以下のようなものがあります。
私がApache::SessionではなくWalrus::Session::Liteを使う理由は、こちらのほうが動作環境を選ばず、再配布が容易だからです。 CGI::SessionではなくWalrus::Session::Liteを使う理由は、オブジェクト指向的なアクセスではなく、ハッシュに紐付けて、普通のハッシュ値のように扱いたかったからです。 もしこれらの理由に該当しないなら、おそらく上のどちらかのモジュールのほうが良い選択肢です。
Apache::Sessionモジュールは強力なモジュールです。
Apache::Sessionモジュールは一時期使おうかと検討して(簡単にテストもして)いたのですが、バックエンドをDBMSにするつもりはなく、そうするとファイルの扱いがいささかBuggyに思えたこと、tie時の引数指定が面倒にだったことで、使わないまま来てしまいました。 Pure Perlとはいえ関連ファイルが多く、CGIに同梱して配布するのは大変そうに思えたのも理由の一つです。
しかし良いモジュールで、実際にWalrus::Session::Liteのわずかばかりの機能は、全てApache::Sessionと同じか酷似した呼び方で使えます。
CGI::SessionはApache::Sessionに比べれば簡単で、すっきりしたモジュールですが、機能的にそう劣るものではありません。
最後の点は、このモジュールの最大の長所でしょう。
これは、CGIを作る上でかなりの助けになると思います。
CGI::SessionモジュールもPure Perlで、スクリプトをざっと眺め、配布ファイルの同梱物を見た範囲では、CGI/Session.pmファイルとCGI/Sessionディレクトリ、それからauto/CGI/Sessionディレクトリを配布すれば動きそうに見えます。 (確認はしていません。もし確認された方がいらっしゃいましたら、是非結果を教えて下さい。) ハッシュの形でのアクセスをしたかったので、Walrus::Session::Liteを作成した(本当は、作成中にCGI::Sessionの存在に気がついて、でもハッシュ方式のものもあって良い、ということで無理矢理自分を納得させた)のですが、OO方式で良ければこれはずいぶんと使いやすそうなモジュールに思えます。
CGI::Sessionモジュールのドキュメントは、Perldocプロジェクトによって和訳されており、以下のURLから見つけることができます。
コメントスパムがひどいためこのページのコメント欄を削除しました。コメントしたい方は暫定的に「掲示板」のページへお願いいたします。
みたいになってしまいます。今調査中なんですが、何かヒントをいただけませんでしょうか。