最終更新: 2007-06-11 (月) 23:21:42
このページをDeliciousに追加 このページをはてなブックマークに追加 このページをlivedoor クリップに追加 このページをYahoo!ブックマークに追加

dump2html.inc.php プラグインを利用した負荷軽減

目次

概要

dump2html.inc.php は sonots さん作のプラグインで、 PukiWiki の各ページを HTML のファイルとして保存することができます。 HTML 化されたファイルを表示する場合、

  • ブラウザキャッシュが効くようになる
  • Wiki のテキストを毎回 HTML にコンバートする処理が不要になる

というメリットがあるため、サーバーへの負荷をかなり減らすことができます。 そこで次のような仕組みで、この HTML のファイルを活用することを考えます。

  • dump2html.inc.php プラグインを用いて、ページ編集後に自動的に HTML のファイルをダンプ
  • mod_rewrite の機能を使い、HTML 化されたファイルがあればそれを表示
  • HTML 化されたファイルが無ければ、通常の処理を行う

ここでは、PukiWiki 1.4.7 に限定されてしまいますが、拙作の rewritemap.inc.php プラグイン と組み合わせる方法を取ります *1。 dump2html.inc.php プラグイン単体でもいけそうな気がしますので、 この説明をたたき台に誰かチャレンジしてみて下さい *2

既知の問題点

本来 Wiki の出力は動的に変化する部分を含んでいるので、 静的な HTML のファイルにするとやはりいろいろと問題が生じます。

  • 最新の20件の表示が更新されない
    • → recent_iframe.inc.php プラグインにて対応
  • カウンタが更新されない
    • → counter_iframe.inc.php プラグインにて対応
    • → 普通のカウンタ CGI をスキンに埋め込んでもよい
  • ページをリネームしても HTML のファイルが消えずに残る
    • → rename.inc.php プラグインに手を加えることで対処
  • URL に % 記号が含まれているとうまくいかない
  • ls 系のプラグインと相性が悪い

問題点を洗い出し、少しずつ改善していくつもりです。

インストール

まずは準備として、以下の作業を行います。

  • PukiWiki をインストール
  • dump2html.inc.php, rewritemap.inc.php プラグインをインストール
  • PukiWiki 本体を rewritemap.inc.php に対応させるパッチを適用
  • PukiWiki をインストールしたディレクトリに html というディレクトリを作成し、書き込み許可を与える

次に、lib/file.php の page_write() 関数の末尾を以下のように書き換えます。

     links_update($page);
+    if (exist_plugin('dump2html')) {
+        do_plugin_init('dump2html');
+        plugin_dump2html_write_after($page);
+    }
 }

dump2html.inc.php の PKWKHtmlLinkModifier::get_dump_filename() メソッドを以下のように書き換えます。

     function get_dump_filename(&$page, $treedump = FALSE)
     {
+        global $defaultpage;
+
+        if (exist_plugin('rewritemap')) {
+            if ($page === $defaultpage) {
+                return str_replace('%2F', '/', rawurlencode($page)) . '.html';
+            } else {
+                $url    = plugin_rewritemap_url($page);
+                $script = get_script_uri();
+                return substr($url, strrpos($script, '/') + 1);
+            }
+        }
         return ($treedump ? 
                 PKWKHtmlLinkModifier::r_encode($page) : 
                 PKWKHtmlLinkModifier::encode($page)) 
             . '.html';
     }

さらに dump2html.inc.php の設定を以下のように変更して下さい。

default_options['method'] = 'http';
default_options['format'] = FALSE;

ここまでの作業で、ページ編集後に自動的に HTML のファイルがダンプされるようになります。

設定

基本編

PukiWiki のディレクトリにある .htaccess ファイルに、以下の設定を追加して下さい *3

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}html%{REQUEST_URI} -f
RewriteRule .* %{DOCUMENT_ROOT}html%{REQUEST_URI} [L]

RewriteCond %{REQUEST_URI} =/
RewriteCond %{DOCUMENT_ROOT}html/index.html -f
RewriteRule .* %{DOCUMENT_ROOT}html/index.html [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.html$ index.php?cmd=rewritemap&page=$1 [QSA,L]

これで、ダンプされた HTML のファイルがある場合は、それが優先的に表示されるようになります。

応用編

dump2html.inc.php プラグインの説明文にも書かれていますが、 PukiWiki のファイルは別ディレクトリにまとめた方がすっきりします。 ここでは ~/public_html/pukiwiki というディレクトリに PukiWiki がインストールされているものとして説明します。

 

pukiwiki/index.php ファイルを ~/public_html ディレクトリにコピー(もしくは移動)し、 以下のように設定を変更して下さい。

define('DATA_HOME', 'pukiwiki/');
define('LIB_DIR',   'pukiwiki/lib/');

pukiwiki/skin/pukiwiki.skin.php 中の skin/ という箇所(3箇所ほどあります)を以下のように書き換えて下さい。

<?php echo $script . DATA_HOME ?>skin/

pukiwiki/lib/init.php 中の IMAGE_DIR の設定を以下のように変更して下さい。

define('IMAGE_DIR', $script . DATA_HOME . 'image/');

~/public_html/.htaccess ファイルに以下の設定を追加して下さい。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}pukiwiki/html%{REQUEST_URI} -f
RewriteRule .* %{DOCUMENT_ROOT}pukiwiki/html%{REQUEST_URI} [L]

RewriteCond %{REQUEST_URI} =/
RewriteCond %{DOCUMENT_ROOT}pukiwiki/html/index.html -f
RewriteRule .* %{DOCUMENT_ROOT}pukiwiki/html/index.html [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)\.html$ index.php?cmd=rewritemap&page=$1 [QSA,L]

プラグインの対応

rename.inc.php プラグイン

rename.inc.php の plugin_rename_proceed() 関数に以下の処理を追加して下さい。

             links_update($new);
         }
     }
+    if (exist_plugin('dump2html')) {
+        $dump2html = new PluginDump2html();
+        foreach ($pages as $oldpage => $newpage) {
+            $oldfile = $dump2html->get_dump_filename(decode($oldpage));
+            unlink($oldfile);
+            $dump2html->dump_page(decode($newpage), null, true);
+        }
+    }

     $postdata = get_source(PLUGIN_RENAME_LOGPAGE);
     $postdata[] = '*' . $now . "\n";

これで、ページをリネームした時には HTML のファイルがダンプし直されるようになります。

recent.inc.php プラグイン

recent.inc.php プラグインをインラインフレーム化したものを作ってみました。

これを使えば、ダンプした HTML ファイルを表示する場合でも、最新のn件が正しく表示されます。

counter.inc.php プラグイン

counter.inc.php プラグインもインラインフレーム化してみました。

これでカウンタも正しく表示されます。

%記号を含む URL への対応

URL に%記号が含まれていると、 ダンプされた HTML ファイルがあっても利用されないという問題が見つかっています。 例えば、ダンプされたファイルの名前が %3ARenameLog.html の場合、 このファイルには %253ARenameLog.html という URL でアクセスしないといけません。 これは%という記号が URL において特別扱いされる文字であるためです。

 

この問題に対する解決策を、いくつか考えている最中です。

  • %A5%C6%A5%B9%A5%C8.html → A5C6A5B9A5C8.html のような URL になるようにする
  • %A5%C6%A5%B9%A5%C8.html → テスト.html のようにデコードしたファイル名で保存する
  • %A5%C6%A5%B9%A5%C8 → A5C6A5B9A5C8 のような変換ルールが自動登録されるよう、rewritemap.inc.php プラグインを改造する
  • あきらめて、URL に%記号を含むページには、片っ端から英数字の別名を設定する

最初の案は、sonots さんが dump2html.inc.php プラグインで行っている処理と同じです。 これは、rewritemap.inc.php の plugin_rewritemap_url() 関数に1行追加すれば実現できます。

     if (empty($alias)) {
         $alias = str_replace('%2F', '/', rawurlencode($page));
+        $alias = str_replace('%', '', $alias);
     }
     return $baseurl . $alias . PLUGIN_REWRITEMAP_POSTFIX;

ただしこの方法を取ると、URL → ページ名の変換が非常に難しくなるため、 結果として HTML ファイルがダンプされているページしか表示できなくなる、という制限が生じます。 とはいえ、それほどたいした制限でもないので、恐らくこれが最も現実的な解決策です。

ベンチマーク

そのうち ApacheBench でも取ってみるつもりです。

*1 そろそろ rewritemap.inc.php プラグインの PukiWiki Plus! 対応もしないと…。
*2 と書いているうちに、sonots さんご本人が設定方法の例を書いています。あっちの方が簡単そう…。
*3 CONF['DUMPDIR'] = ''; にすればこの設定の前半は不要になるはずですが、それだとダンプされたファイルが散らばってしまいます。

(Counter:1, Today:1, Yesterday:0)
トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   最終更新のRSS