53
デザイナーにもできる デザイナーにもできる 再構築の高速化/負荷分散 再構築の高速化/負荷分散 2013/4/20 2013/4/20 MTCafe MTCafe Tokyo 2013 Spring Tokyo 2013 Spring 藤本 藤本

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

2013/4/202013/4/20MTCafeMTCafe Tokyo 2013 SpringTokyo 2013 Spring

藤本藤本 壱壱

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

2

今日の内容

• 自己紹介

• テンプレートモジュール/ウィジェットのキャッシュ

• PHP/Ajaxによる共通部分の再構築負荷軽減

• 動的生成の併用

• 再構築高速化関連のその他のTips• まとめ

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

3

自己紹介

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

4

自己紹介その1

• 藤本 壱(ふじもと はじめ)

• 昭和44年4月生まれ/今年44歳

• 兵庫県伊丹市出身

• 群馬県前橋市在住

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

5

自己紹介その2

• 本職はPC系のフリーライター

• 2004年秋からMTユーザー

• さまざまなプラグインを開発(MailForm,SuperSort等)

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

6

自己紹介その3

http://www.h-fj.com/blog/

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

7

再構築高速化/負荷分散の基本

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

8

そもそも「再構築」とは?

• ページのデータをデータベースから取り出す

• テンプレート内のテンプレートタグにデータを当てはめる

• 当てはめた後のHTML等をファイルに出力する

これらの処理を減らして高速化

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

9

記事1件あたりの再構築時間をなるべく短縮

記事数

再構築時間

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

10

再構築時間をできるだけ記事数に比例させる

記事数

再構築時間

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

11

再構築を高速化するには?・その①

• 出力するデータを最小限に絞る

• データベースアクセスが減る

• テンプレートに当てはめる処理が少なくなる

• HTMLが短くなる(ファイル出力が速くなる)

実際には絞りづらい

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

12

再構築を高速化するには?・その②

• 処理時間が長いテンプレートタグを極力使わない

• ブログ全体のデータを対象にするテンプレートタグは時間がかかる例:MTArchiveListタグ

実際には使わざるを得ない

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

13

再構築を高速化するには?・その③

• 同じ部分を何度も再構築しない

• 一度再構築した結果を再利用

• テンプレートモジュールのキャッシュ

• PHP/Ajaxを使った共通化

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

14

再構築を高速化するには?・その④

• ページを動的に生成

• ユーザーが訪問した時点でページを生成

• 負荷の分散

• 動的生成の手法

• MT標準のダイナミックパブリッシング

• Perl版ダイナミックパブリッシング

• DynamicMTML• オンデマンド再構築

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

15

テンプレートモジュール/ウィジェットのキャッシュ

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

16

テンプレートモジュール/ウィジェットのキャッシュとは?

• 一度再構築したテンプレートモジュール/ウィジェットの出力結果を記憶

• 同じテンプレートモジュールが再構築される際には、記憶していた出力結果をそのまま出力

• 処理に時間がかかるテンプレートモジュールをキャッシュすると効果的(月別アーカイブリスト、カテゴリ別アーカイブリスト等)

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

17

キャッシュ機能の有効化

• ウェブサイト/ブログごとに設定

• 「設定」→「全般」メニューを選択

• 「モジュール設定」の「モジュールのキャッシュ」をオン

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

18

テンプレートモジュール/ウィジェットごとのキャッシュの設定

• テンプレートモジュール/ウィジェットを開く

• 「テンプレートの設定」部分を開く

• 「モジュールのキャッシュ」部分でキャッシュ方法を設定

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

19

キャッシュの効果が高い部分

• ブログ全体のデータを扱うテンプレートモジュール/ウィジェット

• 例えば・・・

• カテゴリアーカイブ一覧の出力

• 月別アーカイブ一覧の出力

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

20

キャッシュの効果の例

• 記事約1,300件/コメント約2,600件/トラックバック約1,300件のブログでテスト

947

386

286

0 200 400 600 800 1000

再構築の所要時間(秒)

キャッシュなしカテゴリカテゴリ+⽉別

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

21

キャッシュの作り分け

• 同じテンプレートモジュール/ウィジェットでも、状況によって再構築結果が変わる場合

• 例 ある記事と同一カテゴリに属する記事のリスト→ 記事のカテゴリによって結果が変化

• キャッシュのキーを指定

• 状況に応じてキャッシュを作り分ける

• ただしMT5.0~MT5.2.4では不具合あり(5.2.5で修正予定)

Page 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”$>

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

23

ウィジェットでのキー指定

• ウィジェットはMTWidgetSetタグで一括インクルード→ ウィジェット毎のキー指定は不可

• テンプレートモジュールを併用して解決

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

24

ウィジェットでのキー指定

ウィジェット

テンプレートモジュールコピー

<mt:Include module=“テンプレートモジュール名” key=“キー”>

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

25

PHP/Ajaxによる共通部分の再構築負荷軽減

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

26

基本的な仕組み

• 多くのページで共通な部分を1回だけ再構築し別ファイルに出力

• 例:最近のブログ記事一覧、カテゴリアーカイブ一覧、月別アーカイブ一覧

• ユーザーがページにアクセスした時点で、PHPやAjaxで動的に別ファイルを組み込む

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

27

通常の再構築

最新記事一覧

ページ1

最新記事一覧

ページ2

最新記事一覧

ページ3 • 記事を追加する

• 全ページの最新記事一覧を更新する必要が生じる

• やむなく全再構築

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

28

PHP/Ajaxによる共通化

ページ1

最新記事一覧

ページ2 ページ3 • 記事を追加する

• 最新記事一覧のファイルだけ更新すれば良い

• 全再構築は不要

動的組み込み

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

29

MT標準の共通化機能(サーバーサイドインクルード)

• テンプレートモジュール/ウィジェットを独立したファイルに保存

• ページにアクセスがあった時点で動的にテンプレートモジュール/ウィジェットをインクルード

• PHP/SSIなどを利用

• PHP等を動作させるために、ページの拡張子の変更(=URLの変更)やリダイレクト等の作業が必要

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

30

インクルードの有効化

• ウェブサイト/ブログごとに設定

• 「設定」→「全般」メニューを選択

• 「モジュール設定」の「サーバーサイドインクルード」でインクルード方法を指定

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

31

テンプレートモジュール/ウィジェット毎のインクルードの設定

• テンプレートモジュール/ウィジェットを開く

• 「テンプレートの設定」部分を開く

• 「サーバーサイドインクルード」のチェックをオン

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

32

PHPを使った手動インクルード

• テンプレートから各ページに共通部分な部分を抜き出す

• インデックステンプレート等で共通部分を1回だけ再構築

• 各ページの共通部分の組み込み先にPHPを追加<?php include(‘<$mt:BlogSitePath$>共通部分の出力ファイル名’); ?>

• PHP等を動作させるために、ページの拡張子の変更(=URLの変更)やリダイレクト等の作業が必要

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

33

Ajaxを使った手動インクルード

• 共通部分を別ファイルにするまではPHPと同じ

• 共通部分の組み込み先に以下のような部分を入れる

<div id=“hoge”></div><script type=“text/javascript”>jQuery(function(){

jQuery(‘#hoge’).load(‘共通部分の出力ファイル名’);});</script>

• ユーザーがJavaScriptをオフにしていると、Ajaxが動作しない→表示されない

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

34

動的生成の併用

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

35

静的生成と動的生成

• 静的生成

• あらかじめHTMLをファイルに出力

• ページが増えるにつれてHTML出力(再構築)に時間がかかる

• ユーザーのアクセスによる負荷が少ない

• 動的生成

• ユーザーのアクセス時にHTMLを生成

• 再構築が不要

• アクセス数が多いサイトでは、静的生成より強力なサーバーが必要(ランニングコスト増)

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

36

MT標準のダイナミックパブリッシング

• メリット

• 最も分かりやすい(MT標準機能)• テンプレート(またはアーカイブマッピング)単位でダイナミック/

スタティックを指定可能

• デメリット

• PHPで作られている(MT本体はPerl)• テンプレートタグ追加系のプラグインはPerlとPHPの両方で作

る必要がある → 対応プラグインがあまり多くない

• テンプレートに直書きしたPHPは修正が必要(Smartyの仕様に合わせる)

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

37

ダイナミックパブリッシングの利用

• テンプレートの設定を開く

• 「公開」の部分で「ダイナミック」を選択

• アーカイブテンプレートでは、アーカイブマッピングごとに「公開」の部分を設定可能

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

38

Perl版ダイナミックパブリッシング

• 拙作のプラグインhttp://www.h-fj.com/blog/mt5plgdoc/perldynamic.php

• MTのコアのコード(Perl)を利用

• 利用手順はMT標準のダイナミックパブリッシングとほぼ同じ

• 既存のほとんどのプラグインが動作

• テンプレートに直書きしたPHPもそのまま動作

• MT標準のダイナミックパブリッシングに比べて動作が重い(キャッシュやPSGI化で高速化可能)

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

39

DynamicMTML

• アルファサード株式会社様が開発/シックスアパートに寄贈https://github.com/movabletype/DynamicMTML

• 静的/動的の混在動作が可能(必要な部分だけ動的にできる)

• <mt:DynamicMTML>等のタグで動的部分を指定

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

40

DynamicMTMLの例

<h1><$mt:BlogName$></h1><mt:DynamicMTML><p>時刻は<$mt:Date format="%H時%M分%S秒"$>です</p></mt:DynamicMTML>

• 現在の時刻を表示

• ページを読み込みなおすたびに時刻が更新

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

41

オンデマンド再構築

• アルファサード株式会社様が開発https://github.com/alfasado/mt-plugin-rebuild-on-demand

• ページにアクセスがあった時点で静的ファイルが存在しなければ、再構築して静的ファイルを保存

• 静的ファイルがあればそのファイルを出力

• 通常の再構築は静的ファイルを削除するだけ→大幅な時間短縮

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

42

再構築高速化関連のその他のTips

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

43

公開キューの利用

• 公開キュー=バックグラウンドで徐々に再構築

• 見た目上は再構築が短時間で終わる(実際には終わっていないが・・・)

• テンプレートの設定の「公開」部分で「公開キュー経由」を指定

• cronでrun-periodic-tasksを定期実行

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

44

EntriesPerRebuild環境変数

• 一度に再構築する記事の数を指定

• デフォルトでは40• 数を増やすと再構築時間を若干短縮可能

• 増やしすぎると500エラーが発生

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

45

PageButeの罠

• PageBute(静的ページ分割プラグイン)http://www.skyarc.co.jp/engineerblog/entry/2642.html

• 動作原理• 分割対象の記事すべてを一気に再構築

• ページ単位に区切ってファイルに出力

• 大量の記事をページ分割すると処理時間がかかる

• 500エラー発生の原因になりやすい

Page 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

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

47

mt-tmpl-testツール

• テンプレートタグごとの処理時間を調べられるコマンドラインツール

• MTインストール先の「tools」ディレクトリに存在

• 使い方は以下の記事を参照http://www.h-fj.com/blog/archives/2010/03/24-131503.php

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

48

mt-tmpl-testツールの実行例

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

49

まとめ

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

50

まとめ

• キャッシュを活用して無駄な再構築を減らす

• PHP/Ajaxを利用して全再構築を減らす

• 動的生成を利用して負荷を分散する

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

51

One More Thing

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

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/

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

53

ご清聴ありがとうございました