mod_perl 環境下の require されたモジュールのライフサイクル

sunlight さんの実験 を読んで,use(コンパイルフェーズで評価される)ではなく,require & import(実行フェーズで評価される)の場合はどのようになるのだろうと思って追試をしてみました。

同じようなモジュール構成で,

  • mod_perl2
  • PerlInitHandler Apache2::Reload
  • PerlResponseHandler ModPerl::PerlRun

な環境限定でたしかめてみました。

結果は,細かいところで違うものの,基本的には use と同じでした。
細かいところというのは,use だと,初回実行時に

/Module BEGIN
/Module RUN
/Main   BEGIN
/Main   RUN
/Module SUB
/Main   END

となるところが,require だと

/Main   BEGIN
/Main   RUN
/Module BEGIN
/Module RUN
/Module SUB
/Main   END

のように Main でのコンパイルが先行するところです。これは実行フェーズでコンパイルが行われるのであたりまえといえば当たり前です。

なぜたしかめたのかというと,ダイナミックロードしたくて,でも require の場合にも,モジュールが変更されたことを Apache2::Reload が検知してくれるのかなぁ?という疑問からでした。結果は,問題なし,ということで,めでたしめでたしです。