![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
現在私は、多人数同時参加型オンライン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で質問しましょう!
似たような質問が見つかりました
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- 物理学 『数か物か』 4 2022/06/13 06:54
- その他(データベース) 業務用のデータベースサーバーの選び方について 4 2022/11/22 10:22
- 発達障害・ダウン症・自閉症 中学の時にIQ82の境界知能と診断されました。 今の私も、やはり境界知能でしょうか? そしてこれは、 3 2023/02/19 00:37
- 情報処理技術者・Microsoft認定資格 (パイプライン処理)基本情報技術者の演習問題について 1 2023/03/11 17:47
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- 物理学 特殊相対性理論を、完全否定に成功~ガンマの数式は、成立しない。 2 2023/03/08 19:30
- 物理学 微分方程式の物理現象への適用について 3 2023/05/14 12:22
- 中途・キャリア 至急。転職試験合否について。 ご覧頂きありがとうございます。 転職を試みている社会人2年目20歳の第 4 2023/01/07 21:56
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「EJBとServletの違い」「J2SE...
-
simplexml_load_fileのエラー
-
ASPからJavaScriptへの受け渡し...
-
EXCELファイルに誰がアクセスし...
-
URLに~/cgi-bin/~を隠す方法
-
画像アップ時のエラー
-
CGIでソースがそのままでてしま...
-
《エクセルVBA》「他の人が該当...
-
FTPにて553エラー
-
ユーザの所属するグループを取...
-
Perlプログラム上でアラートを表示
-
ファイルのダウンロードがうま...
-
cgiの自動起動
-
VBScriptで、ファイルから任意...
-
phpの中で外部のcgiを実行させ...
-
apache で /cgi-bin/にアクセス...
-
cgi-binのディレクトリの作成方法
-
KENT WEB(昨日の続きです)
-
htmlにアクセスと同時に、あるC...
-
MT/カスタムフィールドでのPDF...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ASPからJavaScriptへの受け渡し...
-
VBAを使用して、外部サーバのフ...
-
「EJBとServletの違い」「J2SE...
-
hostsの設定について
-
Image::Magickの呼び出し
-
CGIとは結局何なのでしょうか。
-
HTML字数制限対応の文字置換 パ...
-
TwitterAPIを使用せずに自動ツ...
-
フレームワークとssh
-
ASPでDLLの使用方法
-
何故か特定のディレクトリで画...
-
c++のサーバー通信
-
net::smtp port設定
-
LAN内に接続されているPCをリ...
-
ソースを見せたくないです。
-
スムーズなサイトリニューアル
-
自宅でPHPを動作させたいのです...
-
リンク参照元について。
-
PerlでWEBサイトを作るために必...
-
CGIのログを違うパソコンへ移動
おすすめ情報