名前¶
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 - 1),' iterations.',
end_html;
}
説明¶
CGI::PushはCGI.pmによって作られるCGIオブジェクトのサブクラスです。 これはサーバ・プッシュ操作に特化しています。それは規則正しい間隔で、 その内容を変更する、動くページを可能にします。
1つのページを描くサブルーチンへのポインタをCGI::Pushに与えます。 サブルーチンが呼ばれるたび、それは新しいページを作成します。 ページの内容は、それまであったものをそれで置き換えるという方法で ブラウザに伝えられます。この技術はHTMLページのほか、画像ファイルでも 機能し、アニメーションGIFを作ることが可能です。
Netscape Navigatorだけがサーバー・プッシュをサポートします。 Internet Explorerはサポートしていません。
CGI::Pushの使い方¶
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);
パラメータは以下の通りです:
- -next_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"; }
特別な効果のために描画ルーチンの中でグローバルな変数を作成し、 参照し、使用することはもちろん自由です。
- -last_page
-
このオプションのパラメータは一連の最後のページを描画することに 責任を持つサブルーチンへのリファレンスを示します。それは-next_pageルーチンが false値を返した後に呼ばれます。このサブルーチンそのものは-next_pageルーチンと まったく同じ呼び出し方を持たなければなりません。
- -type
-
このオプションのパラメータは各ページのコンテント・タイプを示します。 "text/html"がデフォルトです。通常、そのモジュールは各ページは MIMEタイプが異なる(heterogeneous)ものと想定しています。しかし 特別な値"heterogeneous"または"dynamic"のどちらかを指定すると (後者は長いパラメータ名が嫌いな人のための便宜のために提供されています)、 ページ単位にMIMEタイプを-- そしてそのほかのヘッダ・フィールドも--指定することが 出来ます。詳細は"異質な(heterogeneous)ページ"をご覧下さい。
- -delay
-
秒単位でフレーム間の遅延を示します。遅延が小さければページは早く リフレッシュされます。小数の値も許されます。
指定されなければ、-delay はデフォルトで1秒になります。
- -cookie, -target, -expires, -nph
-
これらはCGI::header()での同じ名前のパラメータと同じ意味を持ちます。
指定されなければ、-nphのデフォルトは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()は 機能b<しない>ので、一番簡単な方法は以下に示すように-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 {
return 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()は単に現在の遅延を返します。
CGI::Pushスクリプトのインストール¶
サーバ・プッシュ・スクリプトが正しく機能するためには、解析なしヘッダ(NPH) スクリプトとしてインストールされなければいけません。UNIXシステムでは、 これはしばしば、スクリプトの名前の前に"nph-"をつけることによって実現されます。 NPHスクリプトの理解はWebSTARとMicrosoft IISでは自動的に行われます。 他のサーバのユーザは、ヘルプのためにそのドキュメントをご覧になるべきです。
Apache Webサーバーではバージョン1.3b2からは、サーバー・プッシュ・スクリプトが NPHスクリプトとしてインストールされる必要がありません: NPHスクリプトによって 必要とされる特別なヘッダを不能にするため、do_push() への -nphパラメータがfalse値に設定されなければならないかもしれません。
作者情報(AUTHOR INFORMATION)¶
Copyright 1995-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
バグ¶
このセクションは最初はブランクのままです。
(訳者注:どうもデフォルトのままのようです)
参考資料¶
翻訳者¶
川合孝典(GCD00051@nifty.ne.jp)