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

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

Apache::StatINC

StatINCを使っているのにも関わらず、モジュールのリロードをしてくれないとボヤク貴方。StatINCのリロードの実装は、



eval{ require $key };





となっているので、エラーが発生しても無視され、Server Errorとはならない。さらに悪いのは、このコードだとエラーの発生する行まではコンパイルが進んでしまうと言うこと。シンタクスエラーのあるコードをロードさせてしまうと、途中まで新しい関数がロードされたトンでもない状態になるので、気をつけましょう。




package CacheTest;

my $timestamp = localtime();
sub data{
return "CACHE1 $timestamp(" . \$timestamp . ")";;
}

#ここでコンパイルエラー

my $timestamp2 = localtime();
sub data2{
return "CACHE2 $timestamp2(" . \$timestamp2 . ")";
}

1;






例えばこんなスクリプトをロードさせた後、コメント部分を外してStatINCにリロードさせると、&dataコンパイルフェイズだけが終了し、その後の&data2コンパイルフェイズと実行フェイズは実行されない。その結果、&data2は古い物がそのまま実行され、古い実行結果(更新時間)が返る。&dataに関してはちょっと複雑で、コンパイルフェイズは終わっているので$timestampは新しい変数領域を指しているが、実行フェイズを通っていないので値はセットされず空っぽのままになる。よって、更新時間を返すことはできない。