dump2html.inc.php は sonots さん作のプラグインで、 PukiWiki の各ページを HTML のファイルとして保存することができます。 HTML 化されたファイルを表示する場合、
というメリットがあるため、サーバーへの負荷をかなり減らすことができます。 そこで次のような仕組みで、この HTML のファイルを活用することを考えます。
ここでは、PukiWiki 1.4.7 に限定されてしまいますが、拙作の rewritemap.inc.php プラグイン と組み合わせる方法を取ります *1。 dump2html.inc.php プラグイン単体でもいけそうな気がしますので、 この説明をたたき台に誰かチャレンジしてみて下さい *2。
本来 Wiki の出力は動的に変化する部分を含んでいるので、 静的な 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 の 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 プラグインをインラインフレーム化したものを作ってみました。
これを使えば、ダンプした HTML ファイルを表示する場合でも、最新のn件が正しく表示されます。
counter.inc.php プラグインもインラインフレーム化してみました。
これでカウンタも正しく表示されます。
URL に%記号が含まれていると、 ダンプされた HTML ファイルがあっても利用されないという問題が見つかっています。 例えば、ダンプされたファイルの名前が %3ARenameLog.html の場合、 このファイルには %253ARenameLog.html という URL でアクセスしないといけません。 これは%という記号が 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 でも取ってみるつもりです。