ダイナミックパブリッシングと格闘

過去のblogを全部とりこんだところ1000エントリーを超えました。再構築がめっちゃ遅い。仕方がないのでダイナミック・パブリシングをオンにします。

さて、ダイナミック・パブリッシングでは「テンプレートタグを拡張するプラグインが動作しない」
という致命的な弱点があります。・・・というのをよく聞くのですが、結局のところ”テンプレートタグを拡張するプラグイン”というのが何を指してるのかわからないのです。

またPHP化でincludeしているとうまくいかないとも言います。全く意味がわかりません。だってダイナミックパブリッシングはPHPで動くのにPHPのincludeができないって・・・どういうこと。

とにかく押せ押せでやってみるのです。

とにかく遅いのは、日付とエントリーなのでテンプレートごとに個別に選択するようにして以下のテンプレートをダイナミックにします。

日付アーカイブ
エントリー・アーカイブ

で、別にディスク容量はたんまりとあるのでキャッシュを有効にします。以下のMovable Type 3.3のマニュアル通りに、cacheフォルダの作成と$mt->caching =true;の追加を行います。

ページ・レベルのキャッシング
ダイナミック・パブリッシングを最適化する別の方法は、ページ・レベルのキャッシングを有効にすることです。この機能によって、ダイナミック・パブリッシングは、1つのリクエストから次のリクエストに移行する間、ファイル・システムにキャッシュされるので、スタティック・ページに近いスピードが得られます。長期的に見ると、これはディスク・スペースをより多く消費しますが、性能上の利点があります。ページ・レベルのキャッシングをオンにするには、ブログのルート・ディレクトリにcacheという名前で新しいディレクトリを作成し、パーミッションを777(rwxrwxrwx)に設定する必要があります。次に、Dynamic Site Bootstrapperテンプレートに次の行を加えます。

$mt->caching =true;この行は$mt->view();の行の上に加えてください。この行を削除すると、キャッシング・オプションが無効になります。

修正後に再構築すると、ダイナミック・ページを表示するときに、作成したキャッシュ・ディレクトリ内にキャッシュするようになります。キャッシュされたあとは、ブログ・コンテンツがそのキャッシュされたページより新しい場合、またはリクエストを受けた場合に限り、1ページずつ再構築されます。

しかし以下のエラーがでました。

ページが見つかりません。

include_once({{MTBlogSitePath}}toolbar.php) [function.include-once]: failed to open stream: No such file or directory

{MTBlogSitePath}}が展開されていないようです。toolbar.php自体はダイナミックじゃないテンプレートから生成されたものなのでMTのタグは入っていません。{{MTBlogSitePath}}が悪いとみました。toolbar.phpはmtview.phpと同じフォルダにあるので

include_once('toolbar.php');

にしちゃいました。

これでうまくいったものの。。。いろいろ問題が・・・最近のエントリーの表示がおかしいのと<MTArchiveNext>がおかしいです。仕方ないのでデバッグしました。<MTArchiveNext>は、php/lib/block.MTArchiveNext.phpで展開されます。でこっから archive_lib.phpの_hdlr_archive_prev_next -> get_entryが呼び出されます。で、さらに$mt->db->fetch_entriesにいきます。どうも、php/lib/mtdb_base.php の 512行目からの$orderの設定がおかしいです。

$order = 'desc';
if (isset($blog) && isset($blog['blog_sort_order_posts'])) {
  if ($blog['blog_sort_order_posts'] == 'ascend') {
    $order = 'asc';
  }
}
if (!isset($order)) {
  $order = 'desc';
  if (isset($blog) && isset($blog['blog_sort_order_posts'])) {
    if ($blog['blog_sort_order_posts'] == 'ascend') {
      $order = 'asc';
    }
  }
}

if (!isset($order))のif文には絶対入りません。

上記の15行を以下に置き換えてみると直ります。

if (!isset($args['sort_order'])) {
  $order = 'desc';
  if (isset($blog) && isset($blog['blog_sort_order_posts'])) {
    if ($blog['blog_sort_order_posts'] == 'ascend') {
      $order = 'asc';
    }
  }
} else {
  $order = ($args['sort_order'] == 'ascend') ? 'asc' : 'desc';
  if (isset($blog) && isset($blog['blog_sort_order_posts'])) {
    if ($blog['blog_sort_order_posts'] == 'ascend') {
      $order = ($order == 'asc') ? 'desc' : 'asc';
    }
  }
}

多分、こういうことがしたかったのでは。。。

これで、<MTArchiveNext>も最近のエントリー表示も直りました。