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 でインクルードしているスクリプトを実行したところ、環境変数が更新されない現象が発生した。
雰囲気的に、信頼性は高くない感じ。