トップページ⇒php
1001コメント343KB

mod_perlを使おう!

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん01/11/07 17:42ID:+Gux2iOQ
CGIを激速で実行できるmod_perlについて語りませう。
関連リンク等は>2
0002101/11/07 17:42ID:???
本家
http://perl.apache.org/

日本語解説サイト
http://www1.plala.or.jp/knambo/apa/mod_perl.html

cgi_to_mod_perl(英語)
http://www.perldoc.com/perl5.6.1/lib/cgi_to_mod_perl.html

mod_perl_traps(英語)
http://www.perldoc.com/perl5.6.1/lib/mod_perl_traps.html
0003名無しさん@お腹いっぱい。01/11/07 17:47ID:???
名スレの予感
0004101/11/07 17:52ID:???
最近導入したのですがうまく動いてくれないで困りました。
use strict;はもちろんしてるし、変数の初期化もちゃんとしてて、それでも
動かないから、残っていたグローバル変数も必死(涙 で排除して、
それでも動かないのでよくよくmod_perl_trapsを読むと、「package宣言を
していないファイルをrequireするな」のようなことが書いてあってそれで
なんとか解決しました。html表示用のスクリプト(ヒアドキュメントで
書き出すだけの)をrequireしていたのですが、全部print_htmlという
サブルーチン名にしていて、それが原因でした。
0005101/11/07 17:54ID:???
ところで「グローバル変数は使っちゃだめ」みたいなことはよく言われますが、
環境変数($ENV{...})とかは大丈夫なのかな?
↑実はこれがスレ立てた動機だったりして(笑)

誰か教えて〜
0006名無しさん@お腹いっぱい。 01/11/07 17:57ID:???
mod_perl MLって終わってるの? w
取り合えずFAQは....
正規表現の'o'はダメ
名前空間が変わる、Packageで修飾
exit(0);
$hoge = ''; でクリア
こんな感じ?
0007名無しさん@お腹いっぱい。01/11/07 18:00ID:???
$main::ENV{'HTTP_HOGE'}
0008名無しさん@お腹いっぱい。01/11/08 00:54ID:uKgtvIlV
>>5
%ENVはリクエスト毎にセットしなおされる。
だから、大丈夫だと思う。

といってもApache::Regstryなコードの話ね(あたりまえ)
0009801/11/08 00:55ID:???
う。
Apache::Registryだ。
0010名無しさん@お腹いっぱい。01/11/08 07:45ID:???
コンパイル繋がりでPerlccとかも良い?
FastCGIとかSpeedyとかも    :-)

perlccはB::Cは殆ど速くならないね、ファイルは50KB位のが
800KBとかになった
B::CCに期待したいんだけどこっちは殆どharnessでこけるか
ポインタ周りでヲーニング出て無理やり実行したらコア、って感じ
面白いんだけどあの凶悪なヘッダは追う気にならなかった・・・
0011名無しさん@お腹いっぱい。01/11/08 18:15ID:???
つれづれなるままに、cgi_to_mod_perlの翻訳でも。
0012名無しさん@お腹いっぱい。01/11/08 18:15ID:???
[名前]
cgi_to_mod_perl - CGIの代わりにmod_perlを使うための最初のステップ

[説明]
READMEや他のmod_perlドキュメントに書かれているように、CGIの代わりとして
mod_perlを使うということは、mod_perlパッケージが提供する機能のうちのごく
一部分に過ぎません。ですが、それがmod_perlの一番メジャーな使い方ですので、
すぐ使えるやり方をこの文書で説明します。

[インストール]
INSTALLを読んでください。たいてい次のやり方で大丈夫です。

perl Makefile.PL && make && make install

[設定]
CGI代わりとしてmod_perlを使うときのお勧めの設定です。

Alias /perl/ /real/path/to/perl-scripts/

<Location /perl>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</Location>

'Location'の指すのはURIで、ディレクトリではありません。上の<Location /perl>
というのは、

<Location http://www.hoge.com/perl>;
ということです。
0013名無しさん@お腹いっぱい。01/11/08 18:23ID:???
こうすると、指定した場所の下にあるファイル(あなたのファイルシステムで
/real/path/to/perl-scripts/ 以下にあるファイル)はApache::Registryモジュールに
よって処理されることになります。(Apache::RegistryはCGI環境をエミュレートする
モジュールです。)
ファイルは存在していて、実行可能で、それに'Options ExecCGI'がオンになっていなければ
なりません。

もし、どこに置かれたファイルでもmod_perlが拡張子を見てスクリプトを実行してくれるように
したいなら、設定はこんな感じです:

<Files ~ "\.pl$">
SetHandler perl-script
PerlHandler Apache::Registry
Options ExecCGI
</Files>
0014名無しさん@お腹いっぱい。01/11/08 18:35ID:???
'ScriptAlias'はmod_perlでは'効かない'ことに注意してください。

[CGIの移植]

[I/O]
Perl5.004を使っているならほとんどのCGIスクリプトは手を加えずにmod_perlで動くでしょう。
もし5.003をお使いなら、Perlのビルトイン関数 read() と print() はCGIと同じように動いて
くれません。CGI.pmを使っているなら、昔ながらの print() の代わりに $query->print を
使ってください。

[ヘッダ]
mod_perlはデフォルトではヘッダをまったく送りませんが、もし変えたければこうします。

PerlSendHeader On

これでレスポンス行や一般的なヘッダがmod_cgiと同じように送られるようになります。
ですが、mod_cgiと同じように、PerlSendHeaderも終わりの改行コードは送りませんので、
スクリプト自身が送らなければなりません。例えば:

print "Content-type: text/html\n\n";
0015名無しさん@お腹いっぱい。01/11/08 18:40ID:???
もしCGI.pmを使っていて'print $q->header'としているなら、PerlSendHeaderは
必要「ありません」。

[NPHスクリプト]
'nph'CGIスクリプトを実行したいなら、コードにこれを追加してください:
local $| = 1;

普段 PerlSendHeader を On にしているなら、httpd.confにこれを追加してください:
<Files */nph-*>
PerlSendHeader Off
</Files>
0016名無しさん@お腹いっぱい。01/11/08 18:50ID:???
[プログラミング作法]
CGIはだらしないプログラミングを許してくれますが、mod_perlは違います。
なぜでしょうか? CGIスクリプトの一生はは一回のHTTPリクエストで終わりますし、
それぞれ独立したプロセスです。リクエストが終わればプロセスはなくなり、
グローバル変数や開けっ放しのファイルなど、なにもかもきれいに片付けて
もらえます。しかしmod_perlで走るスクリプトはもっと長い生涯を送ります。
何回ものリクエストの間に、一つのプロセスでいくつものスクリプトが処理されます。
つまり、自分で後片付けをする必要があるのです。耳にされていると思いますが:

必ず'use strict'と'-w'オプションを使うこと!
0017名無しさん@お腹いっぱい。01/11/08 18:57ID:???
このことはmod_perlでのPerlでは他のどんな環境での場合よりも重要です。
必要ではありませんが、「強く」推奨されています。それに長い目で見ると
時間の節約にもなります。
スクリプトをきれいに書いておいて損はないですよ!

[落とし穴]
mod_perl_traps参照
0018名無しさん@お腹いっぱい。01/11/08 18:59ID:???
ふ〜時間かかっちゃった。(もうあったりして・・・日本語訳)
mod_perl_trapsは後ほど。
他にやってくれる人がいたらお任せします〜
0019名無しさん@お腹いっぱい。01/11/09 02:11ID:S+GQdZO0
自分のSUN Cobalt RaQ4の環境変数見てみると、
mod_perlとあります。これはもうmod_perlが入っているってことなんでしょうか?
0020名無しさん@お腹いっぱい。01/11/09 02:30ID:???
mod_perlを入れると
$ENV{SERVER_SOFTWARE} に'mod_perl'が追加され,
$ENV{GATEWAY_INTERFACE} が 'CGI-Perl/1.1' になって
$ENV{mod_perl}が設定されるらしい。

iswebはSERVER_SOFTWAREしか変わってない。
0021名無しさん@お腹いっぱい。01/11/09 08:55ID:nd1WMoVX
うちの場合(影響ありそうなもののみ)
SERVER_SOFTWARE = Apache/1.3.20 (Unix) mod_perl/1.26
GATEWAY_INTERFACE = CGI-Perl/1.1
PERL_SEND_HEADER = On
MOD_PERL = mod_perl/1.26
0022名無しさん@お腹いっぱい。 01/11/09 19:12ID:???
>>10
バイトコードじゃ殆ど意味ないねえ...
俺もCCは殆ど使ってないよ
関係無いけど、某無料サーバ(perl他一切無し)にバイナリ上げてhtaccessで
ExecCGIオーバーライドしたらバイトコードが動いた (w
0023名無しさん@お腹いっぱい。01/11/09 20:44ID:???
>>18
ありがとー、trapは一応有るけど機械翻訳丸出しみたい
http://www.google.com/search?q=cache:yAlKb0cn18k:www2.tech-unet.ocn.ne.jp/__dic__/perl/mod_perl_cgi.html+mod_perl_traps&hl=ja&lr=lang_ja
5003以前でprintが駄目ってのが気になるなぁ・・・
バッファが残っちゃうのかな? 5003使ってないから良いけど
0024名無しさん@お腹いっぱい。01/11/09 23:29ID:???
ネストしたサブルーチンはトラップしにくい

おいらは、speedyCGIのほうが好き。
実際mod_perlはリソース食いすぎ
0025名無しさん@お腹いっぱい。01/11/10 18:55ID:QgGGhVTZ
厨な質問なんですが、
PerlCGIで使っていたスクリプトを、そのままmod_perlで動かした場合はどれくらい速くなるものなのですか?
どんな種類のスクリプトに効果的なのかも分かりません。
宜しければ教えていただけないでしょうか?
0026名無しさん@お腹いっぱい。01/11/10 20:44ID:???
>>どれくらい速くなるものなのですか
解らんけど所詮バイトコード並、PerlはPerlだから、4.5倍なんじゃ無いの?
>>どんな種類のスクリプト
呼ばれれば呼ばれる程効果が有る、勝手に永久常駐して自分でリクエスト捌くようなのだと
全く意味無し。

つーかroot持って無いと使えないんだけど、その辺はOK?
00272501/11/10 21:21ID:???
>>26
回答ありがとうございました。
例えばWebチャットの場合は効果がありそうですね。

mod_perlが組み込まれている無料サーバ(珍しいけど)がありますので(^^;;;
0028名無しさん@お腹いっぱい。01/11/10 21:30ID:???
Xreaか・・・
チャット置いてレン鯖板で晒されないようにな w
00292501/11/10 23:07ID:???
>>28
いえ、設置を考えてるのは掲示板なので、普通に使っても問題ないと思います。
でも共有サーバですし、少しでも負荷を削減できないかと、mod_perlの利用を考えました。

お気遣いありがとうございます(^^;
0030名無しさん@お腹いっぱい。01/11/11 22:41ID:???
http://www.din.or.jp/~bigstone/cgilab/cgitips/mod_perl1.html
むつかしい・・・
0031名無しさん@お腹いっぱい。01/12/03 01:28ID:VLJw8Nzl
保守age
0032名無しさん@お腹いっぱい。01/12/07 02:36ID:???
1ch.tvではグローバル変数つかいまくりでも、mod_perlしてました。
先生、mod_perlって別に難しくないんですね!age
0033名無しさん@お腹いっぱい。01/12/08 02:05ID:???
デキネーヨ
名前空間グチャグチャで動く訳ネーダロ -_-...
0034名無しさん@お腹いっぱい。01/12/10 00:26ID:ko+ATGtx
mod_perlなんて使うよりPHP勉強しろ。
もうPerlが滅びるのも時間の問題なのだから。
0035名無しさん@お腹いっぱい。01/12/10 01:19ID:???
>>33
Apache::PerlRunなら動くでしょーよ。へたれだけど。
0036名無しさん@お腹いっぱい。01/12/10 14:22ID:u4VetMyU
>>34
PHPの勢いの方が心配だよ〜。
0037仕様書無しさん01/12/10 19:34ID:???
>>35
ああそっか、使った事無いから>Apache::PerlRun
これだと殆ど意味ないよね? >毎回コンパイル
実験する価値はあるかにゃ・・・
0038名無しさん@お腹いっぱい。01/12/11 06:57ID:???
Perl自体をexec()しない分、CGIと比べると割と軽くなるYO!
CGIをそのまま使える場合も多いから、性能と開発コストを天秤にかければ、
十分ペイする場合も多いような。
■ このスレッドは過去ログ倉庫に格納されています