CGI::Fast
CGIスクリプトを常駐させる。
cgiスクリプトは、Fast-CGI と呼ばれるメカニズムで httpサーバーから呼び出され、http
サーバーとは別プロセスとして常駐する。perl だけではなく、PHP などでも共通に使えるメカニズムを利用している。
類似のモジュールに SpeedyCGI がある。こちらは、perl
独自のメカニズム(通常のperlインタプリタの代りに、speedyインタープリタを使う)で動作する。
また、apache
の場合、prefork MPM (Multi Processing Module) でしか動作しない。 apache 2.4ではWorker
MPM がデフォルトになったので、近年はメンテナンスされていない模様。
use CGI::Fast;
普通は、この形式でパッケージをロードする。
use utf8 で使う時は、qw(-utf8) を付ける。但し、バグあり。ワイド文字を出力するとapacheのエラーログに警告が出力される。
$cgi = CGI::Fast->new( );
インスタンスの生成。
生成されるオブジェクトは、CGIモジュール派生クラスなので、CGIモジュールのメソッド・プロパティを全て使える。
使用例:
use CGI::Fast qw(-utf8);
my $cgi;
while ($cgi =
CGI::Fast->new( )) {
:
}
while ループ中で exit を実行しないこと。exit すると常駐せずに終了してしまう。
apache 側の設定: Fedoraでは mod_fcgid
をインストールすると設定ファイルも追加される。
下記の設定では、拡張子 .fcgi などのスクリプトが Fast-CGI で動作する。
AddHandler fcgid-script fcg fcgi fpl
バグ(1):
utf8 を出力すると、apacheのエラーログに警告が出力される。抑止するには、cgi
スクリプトに下記のおまじないを追加する。
my $enc = Encode::find_encoding('UTF-8'); my $org = \&FCGI::Stream::PRINT; no warnings 'redefine'; local *FCGI::Stream::PRINT = sub { my @OUTPUT = @_; for (my $i = 1; $i < @_; $i++) { $OUTPUT[$i] = $enc->encode($_[$i], Encode::FB_CROAK|Encode::LEAVE_SRC); } @_ = @OUTPUT; goto $org; };
バグ(2):
別ファイルを require
でインクルードしているスクリプトを実行したところ、環境変数が更新されない現象が発生した。
雰囲気的に、信頼性は高くない感じ。