ようこそゲストさん

adiary開発日誌

お知らせ

絶対使わないと言い切れますか? blog + wiki = adiary

2006/04/15(土) mod_perl で chdir

mod_perl2 (on Apache 2.x)で無理矢理MT(Movable Type)を動かそうとしたり、古いスクリプトをmod_perl2で動かそうとする人たちがいまして。そういうページの中で、mod_perl2はカレントディレクトリをスクリプトのdirに変更しないというのが日本ではなぜか迷信のごとく広まっています。……いやある意味では正しいのですけど。例えばこちらのページでは

PerlFixupHandler "sub { \
	chdir('/project/sfo/www/www.sfo.jp/lib/mt'); \
	return OK; \
}"
PerlResponseHandler ModPerl::Registry

とやって明示的に chdir しています(別にやり玉に挙げているわけではなくて、どこのサイトを見てもおよそこんな感じです)。そもそもなぜ、ModPerl::Registry がスクリプトの場所にカレントディレクトリを変更しないかといえば、worker モデルの場合(Apacheがスレッド動作モデル)の場合、chdir しても途中でカレントディレクトリが変わる可能性がある=あまり意味がないからです。だから chdir を明示的に発行するときは、Apache が prefork(従来のプロセスをforkして並列動作する方式)で動いてることを期待しています。

ここからが本題。mod_perl2のマニュアルによるとmod_perl2にはPrefork専用のハンドラーがあり、

PerlResponseHandler ModPerl::RegistryPrefork
PerlResponseHandler ModPerl::PerlRunPrefork

と(どちらか一つを)書けば chdir してくれるそうです。まあ英語のマニュアルだから自分もcgi開発でもなければ読まなかったのですが、日本での普及率をGoogle先生に聞いてみるとこんな結果になります(汗)

というわけで、以降普及することを期待して終わり(笑)

1: fumiyas 2006年04月15日(土) 深夜2時05分

「例えば」のページの著者です。マルチスレッドな MPM で chdir すると問題があることは理解していまよ。その記事の最後にちょこっと触れています。念の為。

2: なべ 2006年04月15日(土) 深夜2時18分

はいそれは了解しています。mod_perl2がらみの解説記事として書いたものでして(汗) TB、間違えて2つ送信しまして失礼しました(汗)

3: DOZEN 2010年10月19日(火) 午後10時41分

はじめまして、こんにちは。
4年前の記事に今頃コメントするってのもどうなのかな〜と思いますが、とても参考になりました。
ModPerl::PerlRunPreforkでCGI動作前提のPerlスクリプトが動きました!!
ありがとうございます。
どこのサイトにも全然こういう資料がなかったんですよねー。これがなかったらSpeedyCGIにしてるところでした。

4: なべ 2010年10月19日(火) 午後10時47分

役になったなら光栄です。コメントありがとうございます。
4年も経つのに、まだほとんど情報として普及してないんですね(苦笑)
原典が参照されずに、誰かの情報がどんどんコピペされちゃうんだなな^^;;


名前:   

  • TB-URL  http://adiary.blog.abk.nu/07/tb/
  • mod_perl2を有効にしてみる(のつづき) Soukaku's HENA-CHOKO Blog
    で、前回mod_perl2を有効にして、丸二日ほど経過したわけですが、エントリーの再構築で1回タイムアウトしたぐらいで、...