by Hippo2000(2000/8/11)
CGI::Pushモジュールなのです。
原本の著作権はLincoln D. Stein.氏がお持ちです。詳しくは著作権情報をご覧ください。
内容等が間違っていたら修正します。ご連絡ください。
CGI::Push - サーバープッシュへの簡単なインターフェース
use CGI::Push qw(:standard);
do_push(-next_page=>\&next_page,
-last_page=>\&last_page,
-delay=>0.5);
sub next_page {
my($q,$counter) = @_;
return undef if $counter >= 10;
return start_html('Test'),
h1('Visible'),"\n",
"This page has been called ", strong($counter)," times",
end_html();
}
sub last_page {
my($q,$counter) = @_;
return start_html('Done'),
h1('Finished'),
strong($counter),' iterations.',
end_html;
}
CGI::PushはCGI.pmによって作られるCGIオブジェクトのサブクラスです。これはサーバ・プッシュ操作に特化しています。それは規則正しい間隔でそのないようを変更する動くページを可能にします。
1つのページを描くサブルーチンへのポインタをCGI::Pushに与えます。サブルーチンが呼ばれるたび、それは新しいページを作成します。ページの内容は、それまであったものをそれで置き換えるという方法でブラウザに伝えられます。この技術はHTMLページのほか、画像ファイルでも機能します。アニメーションGIFを作ることが可能です。
Netscape Navigatorだけがサーバー・プッシュをサポートします。Internet Explorerはサポートしていません。
CGI::Pushは1つの新しいメソッドdo_push()を標準のCGIスイートに追加します。このメソッドを呼ぶとき、各新しいページを描くことに責任を持つサブルーチンへのリファレンス、間隔、オプションで最後のページを描くサブルーチンを渡します。他のオプションのパラメータはCGI header()メソッドにより理解されるもののほとんどを含みます。
好みによってオブジェクト指向のやりかたでも、そうでなくてもdo_push()を呼ぶことが出来ます:
use CGI::Push;
$q = new CGI::Push;
$q->do_push(-next_page=>\&draw_a_page);
-または-
use CGI::Push qw(:standard);
do_push(-next_page=>\&draw_a_page);
パラメータは以下の通りです:
do_push(-next_page=>\&my_draw_routine);
これは必須パラメータで、各新しいページを描くことに責任を持つサブルーチンへのリファレンスを示します。そのサブルーチンはCGIオブジェクトとサブルーチンが何回呼ばれたかを示すカウンターからなる2つのパラメータ期待します。それは出力する1つまた複数の要素の配列でページの内容を返さなければなりません。再描画するループを中止し、(もしあれが)最後のページを出力するようにfalse値(または空の配列)を返すことが出来ます。
sub my_draw_routine {
my($q,$counter) = @_;
return undef if $counter > 100;
return start_html('testing'),
h1('testing'),
"This page called $counter times";
}
特別な効果のために描画ルーチンの中でグローバルな変数を作成し、参照し、使用することはもちろん自由です。
指定されなければ、-delay はデフォルトで1秒になります。
通常CGI::Pushにより表示されるすべてのページは共通のMIMEタイプを共有します。しかしdo_push() -type パラメータで "heterogeneous"または"dynamic"を指定すると、ケース・バイ・ケースで各ページのMIMEタイプを指定することが出来ます。
もしこのオプションを使えば、各ページのためのHTTPヘッダを作成する責任はあなたあります。描画ルーチンを単純に以下のように変更してください:
sub my_draw_routine {
my($q,$counter) = @_;
return header('text/html'), # ヘッダをここで作成していることに注意
start_html('testing'),
h1('testing'),
"This page called $counter times";
}
好きなヘッダ・フィールドを追加することが出来ますが、しかしいくつかの(クッキーやステータス・フィールドを含めて)はブラウザによって解析されないかもしれません。1つの面白い効果は一連のページを表示し、そして最後のページを表示した後に、ブラウザを新しいURLにリダイレクトすることです。redirect()は機能しないので、一番簡単な方法は以下に示すように-refreshヘッダ・フィールドを使うことです。
sub my_draw_routine {
my($q,$counter) = @_;
return undef if $counter > 10;
return header('text/html'), # ここでヘッダを作成していることに注意
start_html('testing'),
h1('testing'),
"This page called $counter times";
}
sub my_last_page {
header(-refresh=>'5; URL=http://somewhere.else/finished.html',
-type=>'text/html'),
start_html('Moved'),
h1('This is the last page'),
'Goodbye!'
hr,
end_html;
}
もしページ毎にページ間の遅延時間を制御したければ、描画ルーチンの中でpush_delay()を呼び出してください。push_delay()は現在のページが表示された後、次のものを表示する前に遅らせたい秒数を表す、1つの数値の引数を取ります。遅延時間は分数の値にすることができます。パラメータがなければ、push_delay()は単に現在の遅延を返します。
サーバ・プッシュ・スクリプトが正しく機能するためには、解析なしヘッダ(NPH)スクリプトとしてインストールされなければいけません。UNIXシステムではこれはしばしば、スクリプトの名前の前に"nph-"をつけることによって実現されます。NPHスクリプトの理解はWebSTARとMicrosoft IISでは自動的に行われます。他のサーバのユーザは、ヘルプのためにそのドキュメントをご覧になるべきです。
Copyright 1996-1998, Lincoln D. Stein. All rights reserved.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
バグレポートとコメントはlstein@cshl.org に送ってください。
このセクションは最初はブランクのままです。
(訳者注:どうもデフォルトのままのようです)
CGI::Carp, CGI
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。