MovableTypeで長くブログを運営していると、再構築が長くなり、悩みのタネとなる。

「再構築を軽くしたい」って場合は、まず

  1. 一度に処理できる件数を減らしたり
  2. データベースの最適化をしたり
  3. テンプレートのモジュール化(共通化)したり
  4. 不要なタグを極力排除したり
    (<$MTBlogURL$>みたいな全ページ共通の結果が帰るタグは使わないようにする)
  5. それでも効果が無い場合はデーターベースを変更したり、サーバーの引越ししたり

が基本中の基本。
今回紹介するのは、さらに再構築を短くしたい、負荷を減らしたい場合の邪道技。

MTArchiveList lastn="n"を動的(?)に

「動的」ってのとちょっと違うけど、たとえ総記事数が1000件あっても、archive.htmlやsitemap.xmlのループ処理が数件で済めば早くなるんじゃね?ってのが今回の考え。

MTSetVarBlock、MTBlogEntryCount、mt:getvarなどを使って、

「総記事数 - (決め打ちする)過去記事数 = 再構築する記事数」
(のこりは再構築に含めないで実装)

というテンプレートを作ってみる。
すごく簡単に出来ると思いスタートしたのだが、上手く行かない。。。。

失敗例▼

<MTSetVarBlock name="e_count"><$MTBlogEntryCount$></MTSetVarBlock>
<!-- 総記事数を取得 -->
エントリ:総記事数 <$mt:getvar name="e_count"><br />
<$mt:setvar name="e_count" op="-" value="993"$>
<!-- 総記事数994以上で、994番目の記事以降を再構築する -->

<ul>
<MTArchiveList archive_type="Individual" lastn="<$mt:getvar name="e_count">">
<liclass="archive-list-item"><$MTArchiveDate format="%Y.%m.%d"$>:<ahref="<$MTArchiveLink$>"><$MTArchiveTitle$></a></li>
</MTArchiveList>

<li class="archive-list-item">
<a href="http://xxx.com/xxx/xxx.html">過去記事のタイトル1</a></li>
<a href="http://xxx.com/xxx/xxx.html">過去記事のタイトル2</a></li>
<a href="http://xxx.com/xxx/xxx.html">過去記事のタイトル3</a></li>
<a href="http://xxx.com/xxx/xxx.html">過去記事のタイトル4</a></li>
・・・・
</ul>

これが何故か上手く作動しない。緑字の部分
Non-numerics in limit/offset clause

ってなエラーが出る。
「数字以外の何かが使われていますよ」と警告されているのだ。

lastn="n"などの実数を入力する箇所に、mt:getvarなどを利用して変数を使う事は出来ない。

MovableTypeのタグ内に変数(主に数列)を使う場合

MTのタグ内で変数を使う場合、mt:getは必要ないみたい。
「mt:get」は使わず、「$変数名」だけを利用したら上手くいった。

<MTSetVarBlock name="e_count"><$MTBlogEntryCount$></MTSetVarBlock>
<!-- 総記事数を取得 -->
すべてのエントリ:総記事数 <$mt:getvar name="e_count"><br />
<$mt:setvar name="e_count" op="-" value="993"$>
<!-- 総記事数994以上で、994番目の記事以降を再構築する -->

<ul>
<MTArchiveList archive_type="Individual" lastn="$e_count">
<liclass="archive-list-item"><$MTArchiveDate format="%Y.%m.%d"$>:<ahref="<$MTArchiveLink$>"><$MTArchiveTitle$></a></li>
</MTArchiveList>

<li class="archive-list-item">
<a href="http://xxx.com/xxx/xxx.html">過去記事のタイトル1</a></li>
<a href="http://xxx.com/xxx/xxx.html">過去記事のタイトル2</a></li>
<a href="http://xxx.com/xxx/xxx.html">過去記事のタイトル3</a></li>
<a href="http://xxx.com/xxx/xxx.html">過去記事のタイトル4</a></li>
・・・・
</ul>

これでアーカイブページやsitemap.xmlなどでも、
「過去ページのURLは固定決め打ちして、最新の数件だけを再構築
できる。

シックスアパートの公式サイト見ててもこんな記述は見つけられなくて、闇雲に変数やタグを弄り回して発見したのだけれど、、、今度似た様な処理をしたくなった場合はドコを参考にすれば良いのだろう('Α`)

効果

これで日々の更新のインデックス再構築がガツーンと早くなると思ったけど、、、
1記事更新に付き、再構築にかかる時間:15~35秒⇒5~25秒10秒?
 (▲archive.htmlとsitemap.xmlに施した結果)
時々スゲー早くなるけど、サーバーの混雑具合でのバラツキが大きくなった気が。。。
ちょっと微妙でした(^_^;

追記訂正
テスト初日はサーバーやたら重かったみたい。日々の更新のインデックス再構築は、ほぼ10秒以内。1/2~1/3に時間短縮出来ている模様。

わざわざこんな改造するよりサーバーに余裕のある早朝~午前中にCRONで実行させたほうが良いのかも。。。

一応元に戻す時用

上記のやり方だと、過去の日付で記事を追加したり、過去記事を削除した時にデータの整合性が取れなくなるので、何かしらのタイミングで普通の再構築を行うのが良い。

全てのエントリ:<br />
<ul>
<MTArchiveList archive_type="Individual">
<liclass="archive-list-item"><$MTArchiveDate format="%Y.%m.%d"$>:<ahref="<$MTArchiveLink$>"><$MTArchiveTitle$></a></li>
</MTArchiveList>
</ul>

定期的に元に戻す用のタグ▲

とりあえず半年~1年に1回は除外エントリ数の調整をメンテナンスを行う。
または過去記事を修正した時などに元に戻し、全体を修正しようと思う。
lastmodなんかの日付が微妙に変わる時もある事だし(^_^;

おまけsitemap.xml

サイトマップ(sitemap.xml)でも上記小技をを実装すしてみたのでメモ。
自分の覚書きのためにも。

<?xml version="1.0" encoding="<$MTPublishCharset$>"?>
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">
   <url>
      <loc>http://web.tvbok.com/</loc>
      <lastmod><$MTDate format="%Y-%m-%d" language=""$></lastmod>
      <changefreq>daily</changefreq>
      <priority>1.0</priority>
   </url>
<MTSetVarBlockname="e_count"><$MTBlogEntryCount$></MTSetVarBlock><$mt:setvarname="e_count" op="-" value="393"$><MTEntries lastn="$e_count">
   <url>
      <loc><$MTEntryPermalink encode_xml="1"$></loc>
      <lastmod><$MTEntryModifiedDate utc="1" format="%Y-%m-%d"$></lastmod>
      <changefreq>weekly</changefreq>
      <priority>0.5</priority>
   </url>
</MTEntries>
   <url>
      <loc>http://web.tvbok.com/xxx/xxxf.html</loc>
      <lastmod>2010-02-26</lastmod>
      <changefreq>weekly</changefreq>
      <priority>0.5</priority>
   </url>

   <url>
      <loc>http://web.tvbok.com/xxx/xxxr.html</loc>
      <lastmod>2010-02-24</lastmod>
      <changefreq>weekly</changefreq>
      <priority>0.5</priority>
   </url>

</urlset>
#記事の数だけ個別に   <url>~</url>を繰り返し

▲改造版

<?xml version="1.0" encoding="<$MTPublishCharset$>"?>
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">
   <url>
      <loc>http://web.tvbok.com/</loc>
      <lastmod><$MTDate format="%Y-%m-%d" language=""$></lastmod>
      <changefreq>daily</changefreq>
      <priority>1.0</priority>
   </url>
      <MTEntries lastn="9999">
   <url>
      <loc><$MTEntryPermalink encode_xml="1"$></loc>
      <lastmod><$MTEntryModifiedDate utc="1" format="%Y-%m-%d"$></lastmod>
      <changefreq>weekly</changefreq>
      <priority>0.5</priority>
   </url>
</MTEntries>
</urlset>

▲元々のもの

約400件の記事があるこのブログ「バックステージ」も、約600件の記事がある「別館」も、体感できるほどの高速化には至らなかった。
追記訂正
記事数が数百件以上に膨れ上がったMTブログの日々の更新には、かなり効果的なカスタマイズになりそうです。