再構築に時間がかかる場合、テンプレートの観点からは、とにかく処理回数を減らすことを考えます(同時にこれらは、構築段階から注意しておくのが好ましい点でもあります)。
インクルードによる解決
例えば、コンテンツのヘッダーやフッター部分など、全ページ共通の部品については、その部分をインデックステンプレートを静的に出力しておき、各ページからは 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記事の再構築のたびに対象のインデックステンプレートを再構築することになるので、無駄な再構築が行われることになります。何度も再構築が行われる前提の記事アーカイブではなく、記事が所属するインデックステンプレートに埋め込むのが適切です。
どの箇所に問題が存在するか不明な場合、例えば「インデックステンプレートのみ」「記事アーカイブのみ」といったように範囲を限定して再構築を行い、どのアーカイブ、どのテンプレートに時間がかかっているか特定し、さらにテンプレート内を部分的に MTIgnore タグでコメントアウトしていくことでどの箇所が問題であるか特定していきます。
- 次は
- 一覧へ