現在私は、多人数同時参加型オンラインRPGのCGIを自分のサイトで運営していますが、急激に人数が増えてきています。
今のところまだ大丈夫ですが、この先は不安です。
そんなとき、こんな書き込みを見つけました。
*************
CGIが重い方への改造法
サブルーチンの部分を
ライブラリファイル .pl に分割して行けば、軽くなります。
*************
と。
本当に速くなるのでしょうか?理屈が分からないので実用すべきか迷っています。
実験用コピープログラムでテストしましたので、正常には動きました。
ライブラリファイルに分割すると、管理は楽になるのは分かります。が、プログラム実行時は結局読み込んでおくので、速度が上がるのかどうかは疑問なんですが、
Perlに詳しい方、お答え下さい。
No.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 …
No.1
- 回答日時:
ご疑問ももっともだと思います。
むしろPerlにとってはライブラリファイルの開け閉めの時間が余計に増えるわけですから、厳密に言えば
むしろわずかに重くなるように思います。
その説明の言わんとしているところは、「不要なときはそのライブラリ
を読みこまなくてすむことがある」ということなんじゃないでしょうか。
例えば、掲示板のCGIで、書きこみ用のサブルーチンなどを別ファイルに
しておき、書きこみのときだけrequireするようにすれば、
単に閲覧するだけのときなどはそのサブルーチンをコンパイルする
時間が省略できるので少しだけ早くなるでしょう。
それくらいしか思いつきませんね。
状況、お察しします。CGIプログラムのレベルでできる、アルゴリズム
だのによる工夫はすでに検討されていると思いますので、あとは、
処理を別のサーバに分散させるとか、そういった大きな変更しかない
でしょうね。自前サーバであればmod_perlを導入すれば劇的に
変わると思いますが…。
ご丁寧にありがとうございます。
つまり、本体プログラムとそうでない部分(ユーザーごとに追加選択的に処理を行うような部分)は場合によっては切り離した方が若干なりとも速くなるって事ですね?
たとえば、チャットCGIにおける、発言ランキングの別窓リスト表示部などがそうでしょうか?
あと、mod_perlって何ですか?そんなに速いのですか?
Perlとは違ったスクリプトを組むのでしょうか?
私は自前ではないですが、ホスティングサーバーを借りていて、結構自由度が高いんですが、その場合どうでしょう?
って、質問ばかりすみません。。(^^;;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ASPでDLLの使用方法
-
Smarty の Undefined Index
-
イントラネット用HP アクセス解...
-
EXCELファイルに誰がアクセスし...
-
ASP(IIS?)のエラーについて
-
statの戻り値が返ってこない
-
特定URLから
-
ドリームウィーバー8でホームペ...
-
Movabletype 画像の機能について
-
ディレクトリを指定してディレ...
-
フリー配布CGIのファイル名変更
-
patipati設置について
-
cgiファイルで構成された検索結...
-
KENT-WEBのclipmailで文字化け
-
ftpでuploadのとき上書きとする...
-
ファイルダウンロード後に、デ...
-
ダウンロード後 zipファイル削除
-
#!/usr/bin/perl --
-
マイ ネットワーク\\サーバーA(...
-
パーミッションについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ASPからJavaScriptへの受け渡し...
-
HTML文書の中で環境変数を使う...
-
VBAを使用して、外部サーバのフ...
-
ASPでDLLの使用方法
-
LAN内に接続されているPCをリ...
-
イントラネット用HP アクセス解...
-
サーバが落ちているときのエラ...
-
HP-UX (IA64)にVNC等でリモート...
-
CGIでF5連打されたときにガード...
-
メールアドレスの@から後ろが・...
-
CGIが壊れるて?
-
CGI設置可能なレンタルサーバー...
-
IISのバージョンとASPについて
-
ソースを見せたくないです。
-
コンパイルされたCGI(C言語)を...
-
「EJBとServletの違い」「J2SE...
-
LinuxでAsp.netを構築できるMono
-
JSPについて
-
AN HTTPD か Apacheか。
-
eclipseのcvs機能でvistaをcvs...
おすすめ情報