2005年1月4日火曜日

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;
<

0 件のコメント:

コメントを投稿