2006年4月26日

Movable Type で再構築エラーになる場合の原因と対処

Movable Type 3.2-ja-2 で再構築エラーに関する質問を頂くことが多いので、本エントリーにまとめました。

1.エラー現象

「再構築エラー」とは、主に下記の現象を指します。
  • 500エラーが表示される
  • テンプレート内で MTLink タグを使用していると、そこでエラーとなる(場合がある)

いわゆる「500エラー」とは、 Internal Server Error つまり内部サーバエラーのことで、CGI等のプログラムが何らかの理由で実行できない、あるいはプログラムにエラーがある場合に発生します。
MTLink タグのエラーも500エラーと同様で、MTLink タグのエラーに見えるのは、たまたまそこでエラーメッセージを表示できる実装になっているからではないかと推測しています。

2.再構築エラーの原因

Movable Type で再構築エラーが発生する原因としては、これまで頂いたご質問を集計すると、
  • Movable Type の DB に BerkeleyDB を使用
    → BerkeleyDB はお手軽ですがパフォーマンスに難があります
  • エントリー・アーカイブの再構築単位
    → デフォルトの再構築単位は40(エントリー)ですが、この値では再構築エラーになる確率が高いです
  • エントリー・アーカイブの「最近のコメント」で recently_commented_on を利用している
    → lastn 属性を使用しない recently_commented_on 属性の使用はメモリ消費量が増大します

によるものがほとんどのようです。
そしてこれらを誘発する原因として下記が考えられます。

  • サーバのパフォーマンス
  • サーバのメモリ量

よくある例として、複数名で共有しているレンタルサーバが考えられます。このケースでは CPU やメモリ等の事実上のスペックは、マシンを占有する人数や使用頻度に反比例して低下していきます。故に再構築の成功率も同時に低下することになります。
また上記の要因が複合すれば再構築エラーが発生する確率はさらに高くなります。

3.エラー解消方法

とりあえず目前のエラーを回避する方法と、本格的な対処の2通りを紹介します。

3.1 とりあえず回避する

  • デフォルトテンプレートに戻す
    デフォルトテンプレートの状態であれば再構築時のエラーはほぼ皆無という認識です。理由は次の内容をご覧ください。
  • エントリー・アーカイブのサイドバーを削除してみる
    例えば、当サイトの公開テンプレートとデフォルトテンプレートとの大きな違いは、アーカイブページのサイドバーの有無です。公開テンプレートのアーカイブ・テンプレートにはサイドバーにリスト類(カレンダー・最近のエントリー/コメント/トラックバック・カテゴリーリスト・月別アーカイブリスト)を色々と表示しており、その分、MTタグからHTMLマークアップを生成する時間が増加し、結果的に再構築時間に影響を与えることになります。つまりサイドバーにリスト類を表示している場合、それらを全てなくすことで再構築時間を短縮することができます。

なお、再構築エラーは前述の通り複合的な要因で発生します。公開テンプレートでアーカイブテンプレートのサイドバーに情報を表示すること自体についてはテンプレートのバグではありません。その点誤解なきようお願い致します。

3.2 本格的な対処

対処しやすい順番に並べています。
  • 再構築単位を少なくする
    mt-config.cgi の下記の部分を
    # EntriesPerRebuild 40
    から
    EntriesPerRebuild 10
    に書き換えます。10でもエラーになる場合は値をさらに小さくしてください。かなりの方がこれで解消されています。
    3.3 では mt-config.cgi にこの設定自体がなくなっていますので新たに追加してください。
  • DB を MySQL または SQLite または PostgreSQL に移行する
    パフォーマンスに問題のある BerkeleyDB の使用をおやめになることを強く推奨します。SQLite の移行方法については、Movable Type + SQLite を参照ください。
    MySQL自体の性能は高いのですが、ひとつのDBを多くのユーザでシェアしている場合は解消されないかもしれません。心配な場合はレンタルサーバのサポートに確認してください(自宅サーバ+MySQLはかなり快適です)。PostgreSQL については MySQL と同等とお考えください。
    ロリポップの場合は SQLite への移行をお勧めします。
  • サーバを変更する
    レンタルサーバもピンキリで、最終的にはサーバや DB のパフォーマンスに依存します。何をやっても事象が好転しない場合はこれをお勧めします。

2006.04.28 追記
rebuild支援ツールとダイナミックパブリッシングを追加しました。

2006.06.20 追記
文言等修正。

Comments [64] | Trackbacks [33]
2006年4月 4日

Movable Type で1日午前0時のエントリーがカレンダーに反映されない不具合について

「1日のエントリーがカレンダーに反映されませんというご質問を頂いて」調べたところ、エントリーの投稿日を1日の00時00分00秒で保存した場合、カレンダーに該当エントリーのリンクが反映されないことが判明しました。月末の23時59分59秒についても同様のようです。

コードを調査したところ、カレンダーの生成を行っているのは

lib/MT/Template/ContextHandlers.pm

にある _hdlr_calendar で、1ヶ月分のエントリーを取得する処理で該当の投稿日のエントリーだけ除外されてしまうのが原因です。これについては Movable Tyep 3.0 から発生していた現象のようです。

この不具合を解消するには、1日の投稿日に00時00分00秒、月末の投稿日に23時59分59秒を用いないか、下記のパッチをあててください。

--- lib\MT\Template\ContextHandlers.pm.bak      Tue Oct 11 16:47:22 2005
+++ lib\MT\Template\ContextHandlers.pm  Tue Apr 04 09:40:46 2006
@@ -2459,7 +2459,7 @@
     my $iter = MT::Entry->load_iter({ blog_id => $blog_id,
                                       created_on => [ $start, $end ],
                                       status => MT::Entry::RELEASE() },
-        { range => { created_on => 1 },
+        { range_incl => { created_on => 1 },
           'sort' => 'created_on',
           direction => 'ascend', });
     my @left;

上記のパッチは安直な発想ですので、適正な修正方法がございましたら情報お待ち申し上げます。Ogawa::memoranda さんのご指摘を頂きましたのでパッチを差し替えました。ありがとうございました。

Comments [2] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3