Perlを中心とした技術系の話などをつらつら

2005年01月04日

MT3.x+mod_perl環境でMTプラグインのロードに失敗するとエラーになる

結構前からなぜかmod_perl環境でMTが動かなくなってしまっていて、しょうがなくCGI環境で動かしていたんですが、どうにも遅くてやりきれないので、ちょっとMTのソースを追ってみました。

エラーの内容はこんな感じです。

Got an error: Can't call method "connection" on an undefined value at /path/to/mt/lib/MT/App.pm line 594.

App.pmの該当行ををみてみるとどうやら、apacheのリクエストオブジェクトが空のためエラーになっている模様。さらにソースを追ってみると、親クラスのMT.pmでのinitでこけていることが判明。そこでMT.pmにwarnを仕込んでデバッグしてみたところ、プラグインのロードに失敗した際に呼ばれるlogメソッドが原因だと判明しました。

MT.pmのinitメソッド内では、pluginのreiquireに失敗すると、$mt->logメソッドを呼び出すのですが、このlogメソッドはMT::App.pmで定義されたlogメソッドによりオーバーライドされています。

そのMT::App::logでは$mt->{apache}->connectionを呼び出しているのですが、$mt->{apache}はこの時点ではまだ生成されていないため、最初に書いたようなエラーがでていたのでした。

このエラーを回避し、プラグインのロードに失敗した際もMTが止まらないようにするためには、失敗した際に、$mt->logではなくMT::logを直接呼び出すように書き換えればOKだと思います。とりあえずパッチを書いてみました。

 --- MT.pm.orig  Tue Jan  4 05:27:34 2005
 +++ MT.pm    Tue Jan  4 05:27:42 2005
 @@ -292,7 +292,7 @@
         $plugin = $1;
         eval { require $plugin };
                  if ($@) {
 -                    $mt->log("Plugin error: $plugin $@");
 +                    MT::log("Plugin error: $plugin $@");
                      return 0;
                  }
                  return 1;

Technorati TAGTechnorati TAG , , ,

Posted by horiuchi at 2005年01月04日 04:53

Continuing the discussion...

このエントリーのトラックバックURL:
http://hori-uchi.com/mt/trackback/250

Comments

Post a comment




Remember personal info?