現在私は、多人数同時参加型オンラインRPGのCGIを自分のサイトで運営していますが、急激に人数が増えてきています。
 今のところまだ大丈夫ですが、この先は不安です。
そんなとき、こんな書き込みを見つけました。
*************
CGIが重い方への改造法
サブルーチンの部分を
ライブラリファイル .pl に分割して行けば、軽くなります。
*************
と。
本当に速くなるのでしょうか?理屈が分からないので実用すべきか迷っています。
実験用コピープログラムでテストしましたので、正常には動きました。

ライブラリファイルに分割すると、管理は楽になるのは分かります。が、プログラム実行時は結局読み込んでおくので、速度が上がるのかどうかは疑問なんですが、
Perlに詳しい方、お答え下さい。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

そうですね。

ただ、発言ランキングのときはまあ別のcgiにすればいいという
話もあります。
ええと、例えばちょっと凝ってるページなので、IE用とNN用で出力の内容を変
えているとします(Javascriptやら特殊なタグを使っているなどで)。
if($ENV{HTTP_USER_AGENT} =~ /MSIE/) {
print "<TABLE...";
} else {
print "<HR>...";
}
などのように。この例ではifで条件分岐してますが、この処理が結構なボリュー
ムがあるとしたら、まるごと別のサブルーチンにする手が考えられますね。
if ($ENV{HTTP_USER_AGENT} =~ /MSIE/) {
&print_for_MSIE();
} elsif (... =~ /Mozilla/) {
&print_for_Netscape();
} else {
&print_for_others();
}
さらにこれらのprint_for_*ルーチンをすべてprint_pageという同じ名前
に変え、別ファイルにして保存しておけば、
if ($ENV{HTTP_USER_AGENT} =~ /MSIE/) {
require "print_msie.pl";
} elsif (... =~ /Mozilla/) {
require "print_netscape.pl";
} else {
require "print_other.pl";
}
&print_page();

という風に書く事が出来ます。ユーザがNetscapeでアクセスしたときはMSIE用
のコードを一切Perlに解釈させずに済むわけです。まあもっと良い例もあると
思いますが、とにかくこんな風な切り分け方はあり得ると思います。

それからmod_perlについてですが、簡単に言うとhttpサーバApacheの中に
Perlを組みこんじゃうようなイメージでいいと思います。MS-Excelの中に
VBAが入っているような、ブラウザの中にJavaScriptがあるような、Emacsの
中にEmacs-lispがあるような、そんな感じです。
CGIが早くなるというのはその機能の一部で、ApacheサーバをPerlで事細かに
カスタマイズできちゃうぞ、というのがメインの目的です。
ですから言語としては、例えばPHPのように「Perlに似た新しいなにか」を覚
える必要はありません。Perlそのものです。当然CPANのモジュールなども今ま
で通り使えます。

いままでのCGIプログラミングに比べて、ちょっと気をつけるべきところは
ありますが(ヘッダーの問題とかグローバル変数を避けるとか)まあほとんど
修正せずにそのまま利用することが可能です(私が携わった業務では、URLの
aliasを使って/cgi-bin/aaa.cgiで呼び出されたらCGIで、まったく同じ
プログラムを/bin/aaa.cgiで呼び出されたらmod_perlで実行するようにして
ました)。

CGIはhttpサーバから別のプロセスとして起動されますね。そしてそのCGIプロ
グラムの仕事が成功に終わったり失敗に終わったりしてもとりあえず過去のこ
とは綺麗さっぱり忘れて、また呼び出せば新たにスクリプトを読み、起動し、
再び仕事を始めます。
mod_perlだと、一度読みこんだプログラムはサーバに記憶されます。次に
呼び出したときにはPerlの起動やスクリプトの読みこみ時間が不用になります。

注意点としては、上記のようなメカニズムですから、グローバルな変数をうっ
かり処理し忘れていたりするといつまでもクリアされずメモリが次第に増えて
いくとか、バグがあってどうも妙な感じになったな、というときにはWWWサーバ
ごと起動しなおしたりする必要があることでしょうか。

お気づきのように、Javaのサーブレットと同じような位置にあるものとも
言えますね。「Javaは遅いじゃん」「いやサーブレットとして使うならCGIよ
りずっと」「mod_perlだったら?」「むむむ、でもスレッドを使えばやっぱ
り…」とまあ、競い合ってるような状況ではあります。

で、肝心のieyasuさんの環境で使えるかどうかですが、mod_perl組みこみとして
Apacheサーバをコンパイルし直す必要があると思います。httpサーバをインストー
ルしなおせるかどうか、という話になりますね。そこまで自由なレンタルサー
バは今時ならあるのでしょうか。ご興味がおありならプロバイダにそのあたり
確認してみてください。

mod_perlのメインサイトはApacheプロジェクトのページからもたどれますが
http://perl.apache.org/
です。日本語で書かれた簡単な紹介ページもいくつかあります。
http://www.din.or.jp/~bigstone/cgilab/cgitips/mo …
    • good
    • 0

ご疑問ももっともだと思います。

むしろPerlにとってはライブラリファイル
の開け閉めの時間が余計に増えるわけですから、厳密に言えば
むしろわずかに重くなるように思います。

その説明の言わんとしているところは、「不要なときはそのライブラリ
を読みこまなくてすむことがある」ということなんじゃないでしょうか。

例えば、掲示板のCGIで、書きこみ用のサブルーチンなどを別ファイルに
しておき、書きこみのときだけrequireするようにすれば、
単に閲覧するだけのときなどはそのサブルーチンをコンパイルする
時間が省略できるので少しだけ早くなるでしょう。
それくらいしか思いつきませんね。

状況、お察しします。CGIプログラムのレベルでできる、アルゴリズム
だのによる工夫はすでに検討されていると思いますので、あとは、
処理を別のサーバに分散させるとか、そういった大きな変更しかない
でしょうね。自前サーバであればmod_perlを導入すれば劇的に
変わると思いますが…。
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございます。
つまり、本体プログラムとそうでない部分(ユーザーごとに追加選択的に処理を行うような部分)は場合によっては切り離した方が若干なりとも速くなるって事ですね?
たとえば、チャットCGIにおける、発言ランキングの別窓リスト表示部などがそうでしょうか?

あと、mod_perlって何ですか?そんなに速いのですか?
Perlとは違ったスクリプトを組むのでしょうか?
私は自前ではないですが、ホスティングサーバーを借りていて、結構自由度が高いんですが、その場合どうでしょう?
って、質問ばかりすみません。。(^^;;

お礼日時:2001/05/09 08:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このカテゴリの人気Q&Aランキング

おすすめ情報