• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
デザイナーにもできる再構築の高速化/負荷分散
 

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

on

  • 2,536 views

テンプレートモジュール/ウィジェットのキャッシュ、PHP/Ajaxによる共通部分の読み込み、動的生成と静的生成の併用などを組み合わせて、再構築...

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

Statistics

Views

Total Views
2,536
Views on SlideShare
2,097
Embed Views
439

Actions

Likes
8
Downloads
10
Comments
0

9 Embeds 439

http://webcake.no003.info 302
http://www.h-fj.com 112
http://creator-life.net 6
http://feedspot.com 6
http://www.feedspot.com 5
http://localhost 4
https://twitter.com 2
http://www.newsblur.com 1
http://s.deeeki.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

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