少し前から気になっていました。Movable Type 4.22で再構築がうまくできない事が。
と言っても、再構築がすべて失敗する訳ではなく、一つ一つ調べてみると、再構築できないのは月別アーカイブだけです。しかも質が悪い事に、何かのエラーを出力してくれる訳でもなく、記事40件分の再構築に成功した(らしい)後、残りの3件がどうしても再構築できないのか、数秒間隔で延々と再読込を続けます。
Googleで探してみましたが、どうもこの現象に遭遇している人は他にはいないのか、ヒットしません。しかし近い所で「再構築に失敗する場合、一度に再構築する記事の数を減らすと直る(事がある)」という情報があったので(どこが出所なのか判らないので特定のリンクはしませんが、Movable Type 再構築 失敗 で検索してみるとこんな感じ)、Movable Typeのアプリケーションディレクトリを%MTAppDir%
とした場合の%MTAppDir%/lib/MT/Core.pm
の321行目、EntriesPerRebuildの初期値を10に減らしてみました。
# %MTAppDir%/lib/MT/Core.pm line 321 # 変更前 'EntriesPerRebuild' => { default => 40, }, # 変更後 'EntriesPerRebuild' => { default => 10, },
10件の記事しか再構築できなくなってしまいました。
まあでも影響している事は間違いあるまい。そんな訳で今度はEntriesPerRebuildを使ってgrepしていると、%MTAppDir%/lib/MT/CMS/Blog.pm
の676行目や728行目に気になる単語が。
# %MTAppDir%/lib/MT/CMS/Blog.pm line 676, 728 Limit => $app->config->EntriesPerRebuild,
Limit? Blog.pm
を覗いてみると、これはサブルーチンrebuildを呼び出す際の引数の一つのようです。
# %MTAppDir%/lib/MT/CMS/Blog.pm line 671-678 # 変更前 $app->rebuild( BlogID => $blog_id, ArchiveType => $type, NoIndexes => 1, Offset => $offset, Limit => $app->config->EntriesPerRebuild, FilterCallback => $cb, ) or return $app->publish_error();
一回分の再構築で処理される記事の数が制限されているのでしょうか。どう扱われているのか追跡してみましたが、%MTAppDir/lib/MT/WeblogPublisher.pm
のサブルーチンrebuildの中、MT::Entry->load_iter
という呼び出しの所で吸収されてしまいました(これがどこに書いてあるのかよく判らない)。
色々試してみてただ一つ判ったのは、再構築が一回だけで終われば、(月別アーカイブ以外も含めて)すべての再構築がうまくいく事です。つまり、全記事数以上の値をLimitに与えてやれば、一応、成功します。
# %MTAppDir%/lib/MT/CMS/Blog.pm line 671-678 # 変更後 $app->rebuild( BlogID => $blog_id, ArchiveType => $type, NoIndexes => 1, Offset => $offset, Limit => $total, FilterCallback => $cb, ) or return $app->publish_error();
但し、いくらEntriesPerRebuildを小さくしても進捗状況は見られません。でもまあ大した害じゃないので許せる範囲内でしょう。
これはバグなんでしょうか、それとも個人ライセンス(無償)使うならこれくらいの制限は自分で外せって事なんでしょうか。バグである事を祈ります。