CGI::SpeedyCGIモジュール v.1.8.3

by Hippo2000(2000/12/19,2001/2/7)

(2001/2/7) まこと@FESさんからの指摘を受けて1ヶ所、誤字を訂正しました。

CGI::SpeedyCGIなのです。

mod_perlと並ぶPerlによるWWWアプリケーションの高速化手法の1つです。
「CGIが遅い」というのと「Perlが遅い」というのとが区別できない人達への回答のほんの一例です。

作者はSam Horroksさんです。メールで了解をいただきました。

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


目次


名前

CGI::SpeedyCGI - CGIスクリプトを永続的に実行することによりスピードアップ


概要

 #!/usr/local/bin/speedy
 ### あなたのCGIスクリプトをここに
 ##
 ## オプションで、いくつかの目的のために use the CGI::SpeedyCGI モジュールを使う
 ##
 # SpeedyCGI オブジェクトの作成
 use CGI::SpeedyCGI;
 my $sp = CGI::SpeedyCGI->new;
 # SpeedyCGIの下で実行されているかどうかを調べる
 print "Running under speedy=", $sp->i_am_speedy ? 'yes' : 'no', "\n";
 # shutdownハンドラの設定
 $sp->set_shutdown_handler(sub { do something here });
 # いくつかのSpeedyCGIオプションの設定/取得
 $sp->setopt('timeout', 30);
 print "maxruns=", $sp->getopt('maxruns'), "\n";

説明

SpeedyCGI はCGI perlスクリプトを永続的に実行する方法です、それは通常それらをより早く実行させます。スクリプトをSpeedyCGIを使うように変換するには、ほとんどの場合、 スクリプトの先頭にあるインタープリタの行を

    #!/usr/local/bin/perl

から

    #!/usr/local/bin/speedy

に変更します。

こうすると、スクリプトが初めて動くと、終了する代わりにSpeedyCGIがperlインタープリタをメモリ上で実行させたままにします。後のからの実行では、それぞれの実行のために新しいperlインタープリタを開始する代わりに、このインタープリタが新しい要求を扱うために使われます。

SpeedyCGI はCGIの仕様に従い、Webサーバーの内部で動きません。非常に速い(Cで書かれた)cgi-binが各要求のために実行されます。そしてこのcgi-binが永続Perlプロセスに接触します。それは通常既にメモリ上にあり、作業を行い、結果を返します。

これらのプロセスはWebサーバーの外側で動くので、Webサーバーそのものに障害をおこすことはできません。同様に各perlプログラムはそれ自身のUnixプロセスを実行しますので、1つのプログラムが他に影響を与えることはできません。そうでなければ永続的に実行されることを禁じるようなメモリー・リークや他の障害を持っているプログラムでコマンド行オプションを扱うこともできます。


オプション

設定方法

SpeedyCGI オプションはいくつかの方法で設定することができます:

コマンドライン
speedyコマンドラインは通常のperlと同じです。例外としてSpeedyCGI特有のオプションは"--"の後で渡すことができます。

例えば:

        #!/usr/local/bin/speedy -w -- -t300

がスクリプトの先頭にあると、SpeedyCGIをperlオプション "-w"で呼び出し、speedyに要求を受け取ってから300秒後に新しい要求がなければ終了しなさいと言う"-t"を渡します。

環境変数
環境変数を使ってオプションに値を渡すことが出来ます。これは最初に実行されるときにのみおこなわれます(つまり、スクリプトの中ではありません)
CGI::SpeedyCGI
CGI::SpeedyCGIモジュールは、実行時にperlスクリプトの中からオプションを設定するためにメソッド setoptを提供しています。現在のオプションを取り出すためのgetoptメソッドもあります。
 
mod_speedycgi
オプションのApacheモジュールを使っているのであれば、SpeedyCGIはhttpd.confファイルで設定することが出来ます。
 

利用できるオプション

以下のオプションが利用可能です。

TIMEOUT
    コマンドライン    : -tN
    環境変数       : SPEEDY_TIMEOUT
    CGI::SpeedyCGI    : TIMEOUT
    mod_speedycgi    : SpeedyTimeout
    デフォルト値     : 3600 (1時間)
    説明:
        N秒後までに新しいリクエストがなければ、永続perl
        インタープリタを終了させる。
        0を使うとタイムアウトなしを意味する。
MAXRUNS
    コマンドライン    :  -rN
    環境変数       : SPEEDY_MAXRUNS
    CGI::SpeedyCGI    : MAXRUNS
    mod_speedycgi    : SpeedyMaxruns
    デフォルト値     : 0 (つまり上限なし)
    説明:
        PerlインタープリタはN回実行すると、終了する。
TMPBASE
    コマンドライン    : -Tstr
    環境変数       : SPEEDY_TMPBASE
    CGI::SpeedyCGI    : n/a
    mod_speedycgi    : SpeedyTmpbase
    デフォルト値     : /tmp/speedy
    説明:
        テンポラリ・ファイルを作成するために指定された接頭辞(PREFIX)を使う。
        これはディレクトリ名ではなく、ファイル名の接頭辞でなければなりません。
BUFSIZ_POST
    コマンドライン    : -bN
    環境変数       : SPEEDY_BUFSIZ_POST
    CGI::SpeedyCGI    : n/a
    mod_speedycgi    : n/a
    デフォルト値     : 1024
    説明:
        CGIスクリプトにデータを送るバッファのためにNバイト
        使用する。
BUFSIZ_GET
    コマンドライン    :  -BN
    環境変数       : SPEEDY_BUFSIZ_GET
    CGI::SpeedyCGI    : n/a
    mod_speedycgi    : n/a
    デフォルト値     : 8192
    説明:
        CGIスクリプトからデータを受け取るバッファのためにNバイト
        使用する。
MAXBACKENDS
    コマンドライン    : -MN
    環境変数       : SPEEDY_MAXBACKENDS
    CGI::SpeedyCGI    : n/a
    mod_speedycgi    : n/a
    Default Value    : 0
    説明:
    0でなければ、speedyが与えられた時間で生成するバックエンド
  プロセスの数を制限する。これは大きなperlライブラリがシステムを
   Speedyがやってきたリクエストを扱うバックエンドを生成する時、
   speedyプロセスの爆発がある地点までシステムを遅くさせてしまう繰り
   返しを防ぐことを目指しています。

メソッド

以下のメソッドがCGI::SpeedyCGIで利用することができます。

new 
新しいCGI::SpeedyCGI オブジェクトの作成
    my $sp = CGI::SpeedyCGI->new;
set_shutdown_handler($function_ref)
perlインタープリタが終了する直前に呼び出される関数を登録する。これは各リクエストの終わりではなく、(タイムアウト、maxrunなどにより)perlインタープリタが完全に終了することが決まっているときです。
    $sp->set_shutdown_handler(sub {$dbh->logout});
i_am_speedy
このスクリプトがSpeedyCGIで動いているのか、そうでないのかを示すブール値を返します。CGIスクリプトは通常のperlでもSpeedyCGIでも動くことが出来ます。このメソッドはそのスクリプトがどちらの環境で動いてるのかが分かるようにします。
    $sp->i_am_speedy;
setopt($optname, $value)
オプションのセクションで説明したSpeedyCGIオプションの1つを設定します。そのオプションが持っていた前の値を返します。$optnameは大文字小文字を区別しません。
    $sp->setopt('TIMEOUT', 300);
getopt($optname)
SpeedyCGIオプションの1つの現在の値を返します。$optnameは大文字小文字を区別しません。
    $sp->getopt('TIMEOUT');

インストール方法

SpeedyCGIはperl バージョン5.004_04 と 5.005_02、そしてSolaris 2.6, Redhat Linux 5.1, そして FreeBSD 3.1で試してみました。他のOSやPerlの前のバージョンでは問題があるかもしれません。

インストールするためには以下のようにします:

    perl Makefile.PL
    make
    make test
    make install

これにより"speedy"バイナリが"perl"がインストールされているところと同じディレクトリにインストールされます。オプションのApacheモジュールをインストールしたければ、apacheディレクトリにあるREADMEをご覧ください。


バグ


やるべきこと


メーリングリスト

speedycgi@newlug.org. 本文を"subscribe"として speedycgi-request@newlug.org にメッセージを送って参加してください。

アーカイブは http://newlug.org/mailArchive/speedycgi にあります。


ダウンロード

SpeedyCGI は以下のところからダウンロードできます:

    http://daemoninc.com/speedycgi
    http://www.cpan.org/modules/by-authors/id/H/HO/HORROCKS/

作者

    Sam Horrocks
    Daemon Consulting Inc.
    http://daemoninc.com
    sam@daemoninc.com

著作権

(原文のまま)

Copyright (c) 1999-2000 Daemon Consulting Inc. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


ホーム Perlの小技

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