再構築に時間がかかる場合、テンプレートの観点からは、とにかく処理回数を減らすことを考えます(同時にこれらは、構築段階から注意しておくのが好ましい点でもあります)。
まず、どのテンプレートの処理に時間がかかっているかを確認し、原因を切り分けます。
そのうえで、複数のテンプレートに共通して時間がかかっている場合は共通処理の見直しを、特定のテンプレートのみ時間がかかっている場合は、そのテンプレート内のボトルネックの解消を検討します。
時間がかかっているテンプレートを特定する
再構築全体に時間がかかっていて原因が分からない場合は、最初からすべてを再構築するのではなく、「インデックステンプレートのみ」「記事アーカイブのみ」など、対象を限定して再構築する方法が有効です。
対象を絞って再構築時間を比較し、時間がかかっているアーカイブやテンプレートを特定してください。
また、インデックステンプレート、アーカイブテンプレートそれぞれについて、テンプレート編集画面からプレビューを実行し、表示されるまでに時間がかかるテンプレートがないか確認します。
特定のテンプレートに時間がかかる場合は、MTIgnore タグを使ってテンプレート内の処理を部分的にコメントアウトしながらプレビューを行うことで、具体的にどの処理がボトルネックになっているかを切り分けます。
複数のテンプレートで同様に時間がかかる場合は、各テンプレートで共通して実行している処理に時間がかかっている可能性があります。「インクルードによる解決」を参考に、共通処理を各ページの再構築時に繰り返し実行しない構成を検討してください。
一方、特定のテンプレートだけプレビューに時間がかかる場合は、そのテンプレート内の処理がボトルネックになっている可能性があります。「ボトルネックの解消」を参考に、処理負荷の高い記述がないか確認してください。
インクルードによる解決
例えば、コンテンツのヘッダーやフッター部分など、全ページ共通の部品については、その部分をインデックステンプレートを静的に出力しておき、各ページからは SSI インクルードや、PHP で include() するようにしておけば、全ページを再構築しなくても反映されます。DynamicMTML をご利用であれば、MTInclude タグでも同じことを実現可能です。
- 出力しておいた header.inc を php でインクルードする
-
<?php include("/var/www/html/include/header.inc"); ?>
- 出力しておいた header.inc を、DynamicMTML の MTInclude タグでインクルードする
-
<MTInclude file="/var/www/html/include/header.inc">
ボトルネックの解消
テンプレートの記述
また、構築当初は時間がかからなかったのに、運用していくうちに時間がかかるようになった、ということであれば、テンプレート内に記事全件をループ処理しているような、件数に応じて時間がかかるようになってしまう処理が存在することが疑われます。
例えば、ブロックタグ MTEntries で全件ループして条件を満たす場合のみ出力する、といったことをしている場合は、field:foo モディファイアを使うなどして、フィルタによってループ対象を削減することを検討します。
- 記事を全件処理しながら、カスタムフィールドのタグ「customfield_foo」が「1」の場合のみタイトルを出力
-
<MTEntries limit="9999"> <MTIf tag="customfield_foo" eq="1"> <$MTEntryTitle$> </MTIf> </MTEntries> - field:foo モディファイアで絞り込むことで処理回数を削減
<MTEntries field:foo="1"> <$MTEntryTitle$> </MTEntries>
フィルタしているが、必要な箇所が複数存在するので何回も行っている、といった場合であれば、一回のループにまとめ、ループ内でそれぞれの箇所に対して出力すべき内容を組み立ててテンプレート変数に格納しておき、必要なタイミングで出力する、といったことを検討します。
再構築対象の削減
また、MTRebuildIndexByID タグを使って他のワークスペース/スペースのインデックステンプレートを再構築させている場合、対象のインデックステンプレートを再構築する時間もかかります。
例えばこれを記事アーカイブテンプレートに埋め込んでいた場合、1記事の再構築のたびに対象のインデックステンプレートを再構築することになるので、無駄な再構築が行われることになります。何度も再構築が行われる前提の記事アーカイブではなく、記事が所属するインデックステンプレートに埋め込むのが適切です。
- 次は
- 一覧へ


