CGI::Persistentモジュール

by Hippo2000(2000/8/9)

CGI::Persistentモジュールなのです。Apache::Sessionと同じような働きをするものです。

原本の著作権はVipul Ved Prakash氏がお持ちです。詳しくは作者をご覧ください。

内容等が間違っていたら修正します。ご連絡ください。


目次


名前

CGI::Persistent -- CGIアプリケーションのためのトランスペアレントな状態永続化


概要

    use CGI::Persistent; 

    my $cgi = new CGI::Persistent "/directory";
    print $cgi->header (); 
    my $url = $cgi->state_url (); 
    print "<a href=$u>I am a persistent CGI session.</a>"; 


ステートレス問題の解決法

HTTPはステートレスなプロトコルです;HTTPサーバはオブジェクトを提供した後、接続をクローズします。リクエストの詳細の記憶は何も残しません。そして、すでに提供したものとその後のリクエストとを関連付けません。これはHTMLページやイメージ要素のような静的なリソースではうまく機能しますが、複雑なユーザ対話はしばしば複数のリクエストとWeb資源の異なる部分をまたがって、状態を保存することを要求します。

ステートレスなサーバでのステートフルはNetscapeクッキーのようなクライアント側の機能(これは一般的なプライバシーの原則からはいやなものだと考えられます)か、あるいはフォームでのヒドゥンフィールドとURLでのvalue属性の組によって実現されています。状態を保持したURLがより好まれます。というのも、クライアントの設定に依存しないからです。しかしアプリケーションが複雑さを増大させるので非現実的なものになりがちです。

CGI::Persistent はこの問題を、サーバ側に状態情報を格納する永続的なCGIセッションを導入することにより解決します。新しいセッションが始まると、CGI::Persistentは自動的にユニークな状態識別文字列を生成し、サーバ上の永続オブジェクトに関連付けます。特定のセッションを参照するように状態識別文字列はURLまたはフォーム使われます。リクエスト属性はトランスペアレントに関連付けられたオブジェクトにコミットされ、オブジェクトデータは問い合わせに結び付けられます。

CGI::Persistent はCGI.pmから派生しています。CGI.pmメソッドは適切にオーバーライドされています。ほんの少しの新しいメソッドが追加されています。


メソッド

new()
新しいCGIオブジェクトを作成し、その関連付けられた永続状態へバインドします。何も関連付けられた状態がなければ、新しい状態イメージが作成されます。new()は2つのオプションの引数を取ります。最初の引数は永続オブジェクトのディレクトリで、状態情報が格納される場所です。理想的には、これは状態ファイルにささげるディレクトリを分けるべきです。ディレクトリが指定されなければ、現在のワーキング・ディレクトリが想定されます。

new() は問い合わせから取得する変わりに、引数のリストでも状態識別子を取ることが出来ます。このモジュールを異なるセッションをまたがって残したい構成データを格納するために使っているのであれば便利かもしれません。

例:

 $q = new CGI::Persistent; 
 $q = new CGI::Persistent "/dope";
 $q = new CGI::Persistent  undef, "/dope/924910985.134";

state_url()
状態識別文字列付きのURLを返します。このURLは問い合わせと関連付けられた永続セッションを参照するために使われなければなりません。
state_field()
HTMLに入れるためのhiddenタイプのINPUTを返します。state_url()のように、この要素はフォームで関連付けられた永続セッションを参照するために使われます。
 
delete()
delete() は名前付き属性を問い合わせから削除するオーバーライドされるメソッドです。その属性と関連付けられた永続オブジェクトフィールドも削除されます。

重要な注意:属性は明示的にdelete()されなければ、あなたに付きまとうでしょう。クリアが必要な制御属性や他のコンテキストに依存するフィールドをクリアすることを忘れないでください。CGI/delete()をご覧下さい。

 
delete_all()
もう1つのオーバーライドされたメソッド。すべての属性とそのセッションの永続的なディスクイメージを削除します。このメソッドはセッションを回復できないように破壊したいときに使われます。CGI/delete_all()をご覧下さい。

添付したCGI例、roach.cgiは複数ページの入力フォームを実装することにより、このモジュールの機能を表しています。


参考資料

CGI(3), Persistence::Object::Simple(3)


作者

Vipul Ved Prakash, mail@vipul.net


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。