北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

クラスの初期化(2)

mod_perl(Apache::Registry)環境下ではさらに複雑となる。まず、モジュールが他のスクリプトにおいて読み込み済みの場合、メインルーチンに書いてある処理は実行してくれない。この部分に初期化処理を書く場合は注意が必要だ。



さらに、Apache::StatINCを利用している場合だが、こいつは更新のあったモジュールをrequireはするが、importは呼んでくれない。よって、あるモジュールを書き直したとしても、そのモジュールを利用しているスクリプトがuse時のimportによって恩恵を受けているような場合には、動きが更新されない可能性がある。Exporterを利用しているモジュールなんかは、モロに影響が出る。



package TaraTest;
# TaraTest.pm
use Exporter;
use base qw{Exporter};
our @EXPORT = ('hogehoge');
sub hogehoge{return 'hogehoge'}
1;

# index.pl
use Apache;
use TaraTest;
Apache->request->send_cgi_header("Content-type: text/plain\n\n");
print "test\n";
print hogehoge() . "\n";
print TaraTest::hogehoge() . "\n";





こんな感じのスクリプトを何度も実行してapacheの子プロセスにキャッシュを残した後、TaraTest.pmを書き換えて実行してみると、影響がよくわかる。



まあ、Apache::StatINCがリロードするモジュールを使いたいわけじゃないので、importを呼ばない実装で当然なのだが。

[2005.12.07]

昔ぼやいたような問題もあるので、StatINCは熟知して利用しないと、開発の大きな支障になると思う。