Upload
hajime-fujimoto
View
2.953
Download
7
Embed Size (px)
DESCRIPTION
テンプレートモジュール/ウィジェットのキャッシュ、PHP/Ajaxによる共通部分の読み込み、動的生成と静的生成の併用などを組み合わせて、再構築の高速化や負荷分散をはかる方法を解説します。 MTCafe Tokyo 2013 Springのセッションの資料です。
Citation preview
デザイナーにもできるデザイナーにもできる再構築の高速化/負荷分散再構築の高速化/負荷分散
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
自己紹介その3
http://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件のブログでテスト
947
386
286
0 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=“キー”>
25
PHP/Ajaxによる共通部分の再構築負荷軽減
26
基本的な仕組み
• 多くのページで共通な部分を1回だけ再構築し別ファイルに出力
• 例:最近のブログ記事一覧、カテゴリアーカイブ一覧、月別アーカイブ一覧
• ユーザーがページにアクセスした時点で、PHPやAjaxで動的に別ファイルを組み込む
27
通常の再構築
最新記事一覧
ページ1
最新記事一覧
ページ2
最新記事一覧
ページ3 • 記事を追加する
• 全ページの最新記事一覧を更新する必要が生じる
• やむなく全再構築
28
PHP/Ajaxによる共通化
ページ1
最新記事一覧
ページ2 ページ3 • 記事を追加する
• 最新記事一覧のファイルだけ更新すれば良い
• 全再構築は不要
動的組み込み
29
MT標準の共通化機能(サーバーサイドインクルード)
• テンプレートモジュール/ウィジェットを独立したファイルに保存
• ページにアクセスがあった時点で動的にテンプレートモジュール/ウィジェットをインクルード
• PHP/SSIなどを利用
• PHP等を動作させるために、ページの拡張子の変更(=URLの変更)やリダイレクト等の作業が必要
30
インクルードの有効化
• ウェブサイト/ブログごとに設定
• 「設定」→「全般」メニューを選択
• 「モジュール設定」の「サーバーサイドインクルード」でインクルード方法を指定
31
テンプレートモジュール/ウィジェット毎のインクルードの設定
• テンプレートモジュール/ウィジェットを開く
• 「テンプレートの設定」部分を開く
• 「サーバーサイドインクルード」のチェックをオン
32
PHPを使った手動インクルード
• テンプレートから各ページに共通部分な部分を抜き出す
• インデックステンプレート等で共通部分を1回だけ再構築
• 各ページの共通部分の組み込み先にPHPを追加<?php include(‘<$mt:BlogSitePath$>共通部分の出力ファイル名’); ?>
• PHP等を動作させるために、ページの拡張子の変更(=URLの変更)やリダイレクト等の作業が必要
33
Ajaxを使った手動インクルード
• 共通部分を別ファイルにするまではPHPと同じ
• 共通部分の組み込み先に以下のような部分を入れる
<div id=“hoge”></div><script type=“text/javascript”>jQuery(function(){
jQuery(‘#hoge’).load(‘共通部分の出力ファイル名’);});</script>
• ユーザーがJavaScriptをオフにしていると、Ajaxが動作しない→表示されない
34
動的生成の併用
35
静的生成と動的生成
• 静的生成
• あらかじめHTMLをファイルに出力
• ページが増えるにつれてHTML出力(再構築)に時間がかかる
• ユーザーのアクセスによる負荷が少ない
• 動的生成
• ユーザーのアクセス時にHTMLを生成
• 再構築が不要
• アクセス数が多いサイトでは、静的生成より強力なサーバーが必要(ランニングコスト増)
36
MT標準のダイナミックパブリッシング
• メリット
• 最も分かりやすい(MT標準機能)• テンプレート(またはアーカイブマッピング)単位でダイナミック/
スタティックを指定可能
• デメリット
• PHPで作られている(MT本体はPerl)• テンプレートタグ追加系のプラグインはPerlとPHPの両方で作
る必要がある → 対応プラグインがあまり多くない
• テンプレートに直書きしたPHPは修正が必要(Smartyの仕様に合わせる)
37
ダイナミックパブリッシングの利用
• テンプレートの設定を開く
• 「公開」の部分で「ダイナミック」を選択
• アーカイブテンプレートでは、アーカイブマッピングごとに「公開」の部分を設定可能
38
Perl版ダイナミックパブリッシング
• 拙作のプラグインhttp://www.h-fj.com/blog/mt5plgdoc/perldynamic.php
• MTのコアのコード(Perl)を利用
• 利用手順はMT標準のダイナミックパブリッシングとほぼ同じ
• 既存のほとんどのプラグインが動作
• テンプレートに直書きしたPHPもそのまま動作
• MT標準のダイナミックパブリッシングに比べて動作が重い(キャッシュやPSGI化で高速化可能)
39
DynamicMTML
• アルファサード株式会社様が開発/シックスアパートに寄贈https://github.com/movabletype/DynamicMTML
• 静的/動的の混在動作が可能(必要な部分だけ動的にできる)
• <mt:DynamicMTML>等のタグで動的部分を指定
40
DynamicMTMLの例
<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を定期実行
44
EntriesPerRebuild環境変数
• 一度に再構築する記事の数を指定
• デフォルトでは40• 数を増やすと再構築時間を若干短縮可能
• 増やしすぎると500エラーが発生
45
PageButeの罠
• 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
47
mt-tmpl-testツール
• テンプレートタグごとの処理時間を調べられるコマンドラインツール
• MTインストール先の「tools」ディレクトリに存在
• 使い方は以下の記事を参照http://www.h-fj.com/blog/archives/2010/03/24-131503.php
48
mt-tmpl-testツールの実行例
49
まとめ
50
まとめ
• キャッシュを活用して無駄な再構築を減らす
• PHP/Ajaxを利用して全再構築を減らす
• 動的生成を利用して負荷を分散する
51
One More Thing
52
MTCafe 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
ご清聴ありがとうございました