デザイナーにもできる再構築の高速化/負荷分散

4,062 views

Published on

テンプレートモジュール/ウィジェットのキャッシュ、PHP/Ajaxによる共通部分の読み込み、動的生成と静的生成の併用などを組み合わせて、再構築の高速化や負荷分散をはかる方法を解説します。
MTCafe Tokyo 2013 Springのセッションの資料です。

Published in: Technology
0 Comments
9 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,062
On SlideShare
0
From Embeds
0
Number of Embeds
495
Actions
Shares
0
Downloads
20
Comments
0
Likes
9
Embeds 0
No embeds

No notes for slide

デザイナーにもできる再構築の高速化/負荷分散

  1. 1. デザイナーにもできるデザイナーにもできる再構築の高速化/負荷分散再構築の高速化/負荷分散2013/4/202013/4/20MTCafeMTCafe Tokyo 2013 SpringTokyo 2013 Spring藤本藤本 壱壱
  2. 2. 2今日の内容• 自己紹介• テンプレートモジュール/ウィジェットのキャッシュ• PHP/Ajaxによる共通部分の再構築負荷軽減• 動的生成の併用• 再構築高速化関連のその他のTips• まとめ
  3. 3. 3自己紹介
  4. 4. 4自己紹介その1• 藤本 壱(ふじもと はじめ)• 昭和44年4月生まれ/今年44歳• 兵庫県伊丹市出身• 群馬県前橋市在住
  5. 5. 5自己紹介その2• 本職はPC系のフリーライター• 2004年秋からMTユーザー• さまざまなプラグインを開発(MailForm,SuperSort等)
  6. 6. 6自己紹介その3http://www.h-fj.com/blog/
  7. 7. 7再構築高速化/負荷分散の基本
  8. 8. 8そもそも「再構築」とは?• ページのデータをデータベースから取り出す• テンプレート内のテンプレートタグにデータを当てはめる• 当てはめた後のHTML等をファイルに出力するこれらの処理を減らして高速化
  9. 9. 9記事1件あたりの再構築時間をなるべく短縮記事数再構築時間
  10. 10. 10再構築時間をできるだけ記事数に比例させる記事数再構築時間
  11. 11. 11再構築を高速化するには?・その①• 出力するデータを最小限に絞る• データベースアクセスが減る• テンプレートに当てはめる処理が少なくなる• HTMLが短くなる(ファイル出力が速くなる)実際には絞りづらい
  12. 12. 12再構築を高速化するには?・その②• 処理時間が長いテンプレートタグを極力使わない• ブログ全体のデータを対象にするテンプレートタグは時間がかかる例:MTArchiveListタグ実際には使わざるを得ない
  13. 13. 13再構築を高速化するには?・その③• 同じ部分を何度も再構築しない• 一度再構築した結果を再利用• テンプレートモジュールのキャッシュ• PHP/Ajaxを使った共通化
  14. 14. 14再構築を高速化するには?・その④• ページを動的に生成• ユーザーが訪問した時点でページを生成• 負荷の分散• 動的生成の手法• MT標準のダイナミックパブリッシング• Perl版ダイナミックパブリッシング• DynamicMTML• オンデマンド再構築
  15. 15. 15テンプレートモジュール/ウィジェットのキャッシュ
  16. 16. 16テンプレートモジュール/ウィジェットのキャッシュとは?• 一度再構築したテンプレートモジュール/ウィジェットの出力結果を記憶• 同じテンプレートモジュールが再構築される際には、記憶していた出力結果をそのまま出力• 処理に時間がかかるテンプレートモジュールをキャッシュすると効果的(月別アーカイブリスト、カテゴリ別アーカイブリスト等)
  17. 17. 17キャッシュ機能の有効化• ウェブサイト/ブログごとに設定• 「設定」→「全般」メニューを選択• 「モジュール設定」の「モジュールのキャッシュ」をオン
  18. 18. 18テンプレートモジュール/ウィジェットごとのキャッシュの設定• テンプレートモジュール/ウィジェットを開く• 「テンプレートの設定」部分を開く• 「モジュールのキャッシュ」部分でキャッシュ方法を設定
  19. 19. 19キャッシュの効果が高い部分• ブログ全体のデータを扱うテンプレートモジュール/ウィジェット• 例えば・・・• カテゴリアーカイブ一覧の出力• 月別アーカイブ一覧の出力
  20. 20. 20キャッシュの効果の例• 記事約1,300件/コメント約2,600件/トラックバック約1,300件のブログでテスト9473862860 200 400 600 800 1000再構築の所要時間(秒)キャッシュなしカテゴリカテゴリ+⽉別
  21. 21. 21キャッシュの作り分け• 同じテンプレートモジュール/ウィジェットでも、状況によって再構築結果が変わる場合• 例 ある記事と同一カテゴリに属する記事のリスト→ 記事のカテゴリによって結果が変化• キャッシュのキーを指定• 状況に応じてキャッシュを作り分ける• ただしMT5.0~MT5.2.4では不具合あり(5.2.5で修正予定)
  22. 22. 22キーの指定• MTIncludeタグの「key=“キー”」のモディファイア• 例• 記事と同一カテゴリに属する記事のリストを出力• 記事の主カテゴリに応じてキャッシュを作り分ける• キーを「cat_カテゴリのID」にする<mt:EntryPrimaryCategory><mt:SetVarBlock name=“cache_key”>cat_<$mt:CategoryID></mt:SetVarBlock></mt:EntryPrimaryCategory><$mt:Include module=“同一カテゴリ記事リスト” key=“$cache_key”$>
  23. 23. 23ウィジェットでのキー指定• ウィジェットはMTWidgetSetタグで一括インクルード→ ウィジェット毎のキー指定は不可• テンプレートモジュールを併用して解決
  24. 24. 24ウィジェットでのキー指定ウィジェットテンプレートモジュールコピー<mt:Include module=“テンプレートモジュール名” key=“キー”>
  25. 25. 25PHP/Ajaxによる共通部分の再構築負荷軽減
  26. 26. 26基本的な仕組み• 多くのページで共通な部分を1回だけ再構築し別ファイルに出力• 例:最近のブログ記事一覧、カテゴリアーカイブ一覧、月別アーカイブ一覧• ユーザーがページにアクセスした時点で、PHPやAjaxで動的に別ファイルを組み込む
  27. 27. 27通常の再構築最新記事一覧ページ1最新記事一覧ページ2最新記事一覧ページ3 • 記事を追加する• 全ページの最新記事一覧を更新する必要が生じる• やむなく全再構築
  28. 28. 28PHP/Ajaxによる共通化ページ1最新記事一覧ページ2 ページ3 • 記事を追加する• 最新記事一覧のファイルだけ更新すれば良い• 全再構築は不要動的組み込み
  29. 29. 29MT標準の共通化機能(サーバーサイドインクルード)• テンプレートモジュール/ウィジェットを独立したファイルに保存• ページにアクセスがあった時点で動的にテンプレートモジュール/ウィジェットをインクルード• PHP/SSIなどを利用• PHP等を動作させるために、ページの拡張子の変更(=URLの変更)やリダイレクト等の作業が必要
  30. 30. 30インクルードの有効化• ウェブサイト/ブログごとに設定• 「設定」→「全般」メニューを選択• 「モジュール設定」の「サーバーサイドインクルード」でインクルード方法を指定
  31. 31. 31テンプレートモジュール/ウィジェット毎のインクルードの設定• テンプレートモジュール/ウィジェットを開く• 「テンプレートの設定」部分を開く• 「サーバーサイドインクルード」のチェックをオン
  32. 32. 32PHPを使った手動インクルード• テンプレートから各ページに共通部分な部分を抜き出す• インデックステンプレート等で共通部分を1回だけ再構築• 各ページの共通部分の組み込み先にPHPを追加<?php include(‘<$mt:BlogSitePath$>共通部分の出力ファイル名’); ?>• PHP等を動作させるために、ページの拡張子の変更(=URLの変更)やリダイレクト等の作業が必要
  33. 33. 33Ajaxを使った手動インクルード• 共通部分を別ファイルにするまではPHPと同じ• 共通部分の組み込み先に以下のような部分を入れる<div id=“hoge”></div><script type=“text/javascript”>jQuery(function(){jQuery(‘#hoge’).load(‘共通部分の出力ファイル名’);});</script>• ユーザーがJavaScriptをオフにしていると、Ajaxが動作しない→表示されない
  34. 34. 34動的生成の併用
  35. 35. 35静的生成と動的生成• 静的生成• あらかじめHTMLをファイルに出力• ページが増えるにつれてHTML出力(再構築)に時間がかかる• ユーザーのアクセスによる負荷が少ない• 動的生成• ユーザーのアクセス時にHTMLを生成• 再構築が不要• アクセス数が多いサイトでは、静的生成より強力なサーバーが必要(ランニングコスト増)
  36. 36. 36MT標準のダイナミックパブリッシング• メリット• 最も分かりやすい(MT標準機能)• テンプレート(またはアーカイブマッピング)単位でダイナミック/スタティックを指定可能• デメリット• PHPで作られている(MT本体はPerl)• テンプレートタグ追加系のプラグインはPerlとPHPの両方で作る必要がある → 対応プラグインがあまり多くない• テンプレートに直書きしたPHPは修正が必要(Smartyの仕様に合わせる)
  37. 37. 37ダイナミックパブリッシングの利用• テンプレートの設定を開く• 「公開」の部分で「ダイナミック」を選択• アーカイブテンプレートでは、アーカイブマッピングごとに「公開」の部分を設定可能
  38. 38. 38Perl版ダイナミックパブリッシング• 拙作のプラグインhttp://www.h-fj.com/blog/mt5plgdoc/perldynamic.php• MTのコアのコード(Perl)を利用• 利用手順はMT標準のダイナミックパブリッシングとほぼ同じ• 既存のほとんどのプラグインが動作• テンプレートに直書きしたPHPもそのまま動作• MT標準のダイナミックパブリッシングに比べて動作が重い(キャッシュやPSGI化で高速化可能)
  39. 39. 39DynamicMTML• アルファサード株式会社様が開発/シックスアパートに寄贈https://github.com/movabletype/DynamicMTML• 静的/動的の混在動作が可能(必要な部分だけ動的にできる)• <mt:DynamicMTML>等のタグで動的部分を指定
  40. 40. 40DynamicMTMLの例<h1><$mt:BlogName$></h1><mt:DynamicMTML><p>時刻は<$mt:Date format="%H時%M分%S秒"$>です</p></mt:DynamicMTML>• 現在の時刻を表示• ページを読み込みなおすたびに時刻が更新
  41. 41. 41オンデマンド再構築• アルファサード株式会社様が開発https://github.com/alfasado/mt-plugin-rebuild-on-demand• ページにアクセスがあった時点で静的ファイルが存在しなければ、再構築して静的ファイルを保存• 静的ファイルがあればそのファイルを出力• 通常の再構築は静的ファイルを削除するだけ→大幅な時間短縮
  42. 42. 42再構築高速化関連のその他のTips
  43. 43. 43公開キューの利用• 公開キュー=バックグラウンドで徐々に再構築• 見た目上は再構築が短時間で終わる(実際には終わっていないが・・・)• テンプレートの設定の「公開」部分で「公開キュー経由」を指定• cronでrun-periodic-tasksを定期実行
  44. 44. 44EntriesPerRebuild環境変数• 一度に再構築する記事の数を指定• デフォルトでは40• 数を増やすと再構築時間を若干短縮可能• 増やしすぎると500エラーが発生
  45. 45. 45PageButeの罠• PageBute(静的ページ分割プラグイン)http://www.skyarc.co.jp/engineerblog/entry/2642.html• 動作原理• 分割対象の記事すべてを一気に再構築• ページ単位に区切ってファイルに出力• 大量の記事をページ分割すると処理時間がかかる• 500エラー発生の原因になりやすい
  46. 46. 46静的/動的ページ分割の併用• 1ページ目のみ静的• 2ページ目以降を動的• MT標準のページ分割機能を利用http://www.h-fj.com/blog/archives/2012/12/12-115414.php• リアルタイム再構築プラグインを利用http://www.h-fj.com/blog/archives/2008/08/01-103321.php
  47. 47. 47mt-tmpl-testツール• テンプレートタグごとの処理時間を調べられるコマンドラインツール• MTインストール先の「tools」ディレクトリに存在• 使い方は以下の記事を参照http://www.h-fj.com/blog/archives/2010/03/24-131503.php
  48. 48. 48mt-tmpl-testツールの実行例
  49. 49. 49まとめ
  50. 50. 50まとめ• キャッシュを活用して無駄な再構築を減らす• PHP/Ajaxを利用して全再構築を減らす• 動的生成を利用して負荷を分散する
  51. 51. 51One More Thing
  52. 52. 52MTCafe Saitama 2013• 6月29日(土)に大宮(コワーキングスペースOffice 7F)にて開催• 「WPer&PHPerのためのMovable Type」がテーマ• WordPress on Movable Type(藤本)• Movable TypeのPHP API(柳下さん)• ダイナミックパブリッシング&DynamicMTML用プラグインの開発方法(野田さん)• セッション/LT希望者募集http://kokucheese.com/event/index/85970/
  53. 53. 53ご清聴ありがとうございました

×