PukiWikiでbodycasheを利用してHTMLコンバートタイムを70倍に高速化


投稿日:2013年8月26日
  • 4
  • 0



大量アクセスに弱いPukiWiki対策

bodycashe

PukiWikiはリクエストされるごとにWiki形式で書かれた文章をHTMLに変換しています。
1ページだけなら大した負荷にはなりませんが、アクセスが10、100と重なるとかなりの負荷になります。

毎回HTMLに変換するのは無駄が多いので、HTMLに変換したものをキャッシュ(保存)します。そのファイルをアクセス時に読み込むことで高速化と、負荷の軽減を実現します。

HTMLファイルのキャッシュ化には「bodycache」というプラグインを利用します。

数あるキャッシュ系プラグインの中でも運用の手間がかからず、正常に動作するお勧めのプラグインです。しかし導入にはPukiWiki本家のファイルを修正する必要があるなど、多少の専門知識が必要になるので、当サイトで導入方法・注意点を解説します。


導入に際して注意点

便利なbodycacheですが、いくつか注意点があります。

1.容量の増加

bodycacheはオリジナルのwiki文章と別に、HTMLに変換したキャッシュを「cacheディレクトリ」に保存します。そのため通常の倍以上の容量を食います。
しかし変換後のファイルもテキストベースのhtmlなので、大容量化の進む昨今のレンタルサーバでは問題になることは稀だと思います。

2.動的なページへ非対応

bodycacheは以下の条件でキャッシュを作成します。

  • 1.記事を読み込んだ際にキャッシュが存在しない場合。(初回アクセス時)
  • 2.記事の更新時。

そのため、更新された記事を調べて一覧表示する機能や、通常の更新と異なる「pcommentプラグイン」などを利用したコメントの挿入などには対応していません。

対策として特定のプラグインを利用しているページではキャッシュ機能を無効にするという対策が可能です。詳しくは下記導入方法を参照してください。

3.オートリンクへの非対応

PukiWikiでは先に[[hoge]]とリンクを書いておき、後にページを作成すると自動でページヘのリンクが作成される機能があります。キャッシュ作成時にリンク先ページがない場合は、リンクが作成されません。(hoge?の状態になる)

本家様でこの対策についてお伺いしたところ、以下の提案をいただきました。

  • 1.更新頻度が少ないサイトの場合はページを更新した際に全てのキャッシュを削除する。
  • 2.cron等を利用して、一定期間経過したらキャッシュを削除する。

どちらの対策も状況に合わせて行わないと逆にサーバの負担を増やすことになリます。サイトの状況に合わせて運用してください。
(2014年1月追記:アクアリウムWikiではお問い合わせフォームに使っているプラグインpkwkmailと相性が悪いため、現在は一時利用を見合わせています。)


bodycacheの導入方法

今回はPukiWiki 1.4.7_notbにたいしてパッチ処理を実行します。処理といっても「http://debian.fam.cx/dists/bodycache/」にある「bodycache_for_147nt_ra176.txt」を実行するだけです。

しかし、パッチ処理は慣れない方には多少ハードルが高く、PukiWikiを独自にカスタマイズしている場合は上手くパッチ処理されないことがあります。そこで今回は、1つ1つファイルを手修正していきます。

1.pukiwiki.php

まずはwikiの「/lib」にある「pukiwiki.php」を修正します。40行目あたりに以下のような記述があるので、bodycache用のコードを追加します。

require(LIB_DIR . 'html.php');
require(LIB_DIR . 'backup.php');

以下のようにする。

require(LIB_DIR . 'html.php');
require(LIB_DIR . 'backup.php');
// bodycache用
require(LIB_DIR . 'bodycache.php');

続いて135行目あたり

$body  = convert_html(get_source($base));

これを以下のように変更

//
//bodycache用の変更
//
//$body  = convert_html(get_source($base));

global $enable_bodycache;
if ( $enable_bodycache ) {
	$body  = render_body( $base );
} else {
	$body  = convert_html(get_source($base));
}

pukiwiki.ini.php

続いてルートディレクトリにある「pukiwiki.ini.php」を編集します。165行目あたり、トラックバック用の設定があるすぐ後に追記します。

// Show trackbacks with an another window (using JavaScript)
$trackback_javascript = 0;
// Show trackbacks with an another window (using JavaScript)
$trackback_javascript = 0;

/////////////////////////////////////////////////
// Bodycache feature

// enable bodycache or not
// default : true
$enable_bodycache = true; 

// use bodycache as default. If it's false, 
// #bodycache(enable) is required per page.
// default : true
$enable_bodycache_default = true; 

// If these (block) plugins are contained in page, bodycache will be disabled.
// Users can increase this plugin list to control bodycache.
// default : array( 'ls2', 'pcomment', 'include' );
$bodycache_disable_plugins = array( 'ls2', 'pcomment', 'include' );

ここで「$bodycache_disable_plugins」という行がありますが、ここで配列に追加したプラグインが使われているページではbodycacheが無効になります。
アクアリウムWikiでは更新ページ一覧を表示する「recent」も追加して、以下のようにしています。

$bodycache_disable_plugins = array( 'ls2', 'pcomment', 'include', 'recent' );

また、特定のページだけbodycacheを無効にしたい場合はページの先頭に以下の記述を追加することでキャッシュファイルの作成を無効にすることができます。
検索プラグインの「sitesearch」などを導入している場合は、検索結果のページに以下の記述が必要になります。

//#bodycache(disable)

 

同じく「pukiwiki.ini.php」にて、bodycacheはPukiWikiのオートリンクに対応していないため、190行目あたりにあるオートリンクの機能をオフにします。もともと「1」になっていた場合は変更する必用はありません。

/////////////////////////////////////////////////
// _Disable_ WikiName auto-linking
$nowikiname = 1;

bodycashe.php

最後に「libディレクトリ」にプラグイン本体である「bodycashe.php」をアップロードします。本家にはパッチファイルしかないので、当サイトでパッチ処理を実行して作成したファイルを配布します。(本家様でGPL v2ライセンスの由、確認済み)

bodycache

以上、2つのファイルの修正と、1つのファイルの追加でキャッシュが有効になります。通常に導入されていれば、ページヘの初回アクセス時に「cache」ディレクトリにファイルが作成されているはずです。


効果の測定

それでは早速効果の測定です。今回は特別長いWikiファイルでテストです。5回アクセスしてみました。

bodycashe導入前

HTML convert time: 1.488 sec.
HTML convert time: 1.476 sec.
HTML convert time: 1.483 sec.
HTML convert time: 1.476 sec.
HTML convert time: 1.436 sec.

bodycashe導入後

HTML convert time: 1.683 sec.
HTML convert time: 0.018 sec.
HTML convert time: 0.015 sec.
HTML convert time: 0.021 sec.
HTML convert time: 0.024 sec.

導入後、初回アクセス時にはキャッシュを保存する関係で多少速度は落ちますが、2回目のアクセスから劇的にHTMLコンバーションタイムが短くなっていると思います。
なんと約70倍も高速になっています。速度だけでなく、CPU負荷も大幅に軽減されます。これでPukiWikiの苦手な大量アクセスもさばけるようになります。


現在のページを共有する



現在のページに関連する記事

PukiWikiでbodycasheを利用してHTMLコンバートタイムを70倍に高速化 5段階評価プラグインを通して学ぶPukiWikiのプラグインを作成する方法
サーバへPukiWikiをインストール サーバへPukiWikiをインストール
PukiWikiでbodycasheを利用してHTMLコンバートタイムを70倍に高速化 PukiWikiでFacebookなどソーシャルメィア用にOGPを設定する方法
spam_filter.phpを導入 spam_filter.phpを導入
PukiWikiの初期設定 PukiWikiの初期設定
PukiWikiでbodycasheを利用してHTMLコンバートタイムを70倍に高速化 Firefox機能拡張のポップアップとコンテンツスクリプトについて
PukiWikiへ「attachref.inc.php」と「areaedit.inc.php」プラグインの導入 PukiWikiへ「attachref.inc.php」と「areaedit.inc.php」プラグインの導入

おすすめの記事

今さら聞けない、変数や関数の命名規則と、まず覚えるべき英単語200

今さら聞けない、変数や関数の命名規則と、まず覚えるべき英単…

Googlebotを手懐ける!robots.txtの書き方とrobots.txtテスターの使い方

Googlebotを手懐ける!robots.txtの書き方とrobots.txtテスター…

コピペから脱出!iptablesの仕組みを理解して環境に合わせた設定をしよう

コピペから脱出!iptablesの仕組みを理解して環境に合わせた設…

開発の最前線でクリエイター・エンジニアに必要なプログラミング言語

開発の最前線でクリエイター・エンジニアに必要なプログラミン…

fluentdとNorikraでDoS攻撃を遮断し、メールで通知する方法

fluentdとNorikraでDoS攻撃を遮断し、メールで通知する方法

初めてでも理解できるようになる「Firefox機能拡張の開発」

初めてでも理解できるようになる「Firefox機能拡張の開発」

Norikraの使い方をサンプルのクエリとイベントを交えて解説

Norikraの使い方をサンプルのクエリとイベントを交えて解説

PukiWikiで5段階評価を付けるプラグインを作成しました

PukiWikiで5段階評価を付けるプラグインを作成しました


いただいたコメントなど

  1. 斎藤 のコメント:

    アクセスが急増してレンタル鯖から追い出されそうだったので助かりました。
    ありがとうございました。
    広告ポチしておきました。

    • oxy のコメント:

      丁寧にコメントありがとうございます。
      お役に立てたようで何よりです。

  2. 匿名 のコメント:

    $bodycache_disable_pluginsや#bodycache(disable)の機能を取っ払うことはできますか?できるだけ簡潔にしたいと思っておりまして

    • oxy のコメント:

      私はプラグインの製作者ではないので、断定はできません。
      その上で、恐らく取り払うことは可能です。しかし、機能を削除しても表示速度には何ら影響は無いはずです。

  3. 匿名 のコメント:

    はじめまして。
    現在「bodycache.inc.php」の配布元が消滅しており困っております。
    どこかにアップロードをお願いできないでしょうか?よろしくお願いいたします。

    • oxy のコメント:

      コメントありがとうございます。
      作った方の許諾がないため、当方で勝手に配布するのは難しいです。
      お役に立てずすみません。

コメントを残す

コメントは認証制のため、すぐには反映されません。

プログラミングに関する質問は「日本語でプログラミングの悩みを解決するQ&Aサイト sukegra」をご利用ください。