最終更新: 2006-06-23 (金) 22:17:12
このページをDeliciousに追加 このページをはてなブックマークに追加 このページをlivedoor クリップに追加 このページをYahoo!ブックマークに追加

キャッシュ利用による PukiWiki 高速化の試み

方針

従来の動作は以下の通り。

  • wiki/*.txt を html に変換して変数 $body に格納
  • $body をスキンに埋め込んで表示

これを以下のように改造する。

  • wiki/*.txt を html に変換したものを、あらかじめ cache/*.html に保存
  • Wiki を編集した際に、cache/*.html を更新
  • 閲覧時は cache/*.html を読み込んで変数 $body に格納

変更箇所

lib/file.php の page_write() に以下のコードを追加。

// Create and write converted html
global $foot_explain, $note_hr;
ksort($foot_explain, SORT_NUMERIC);
$body  = convert_html($postdata);
$notes = ! empty($foot_explain) ? $note_hr . join("\n", $foot_explain) : '';
file_write(CACHE_DIR, $page, $body, $notimestamp);
file_write(CACHE_DIR . 'notes', $page, $notes, $notimestamp);

lib/file.php の page_write() に以下の関数を追加。

function get_converted_html($page = NULL, $lock = TRUE)
{
    $body = '';

    if (is_page($page)) {
        $path  = CACHE_DIR . encode($page) . '.txt';

        if ($lock) {
            $fp = @fopen($path, 'r');
            if ($fp == FALSE) return $body;
            flock($fp, LOCK_SH);
        }

        $body = file_get_contents($path);

        if ($lock) {
            flock($fp, LOCK_UN);
            @fclose($fp);
        }
    }

    return $body;
}

function get_notes($page = NULL, $lock = TRUE)
{
    $array = array();

        if (is_page($page)) {
        $path  = CACHE_DIR . 'notes' . encode($page) . '.txt';

        if ($lock) {
            $fp = @fopen($path, 'r');
            if ($fp == FALSE) return $array;
            flock($fp, LOCK_SH);
        }

        $array = file($path);

        if ($lock) {
            flock($fp, LOCK_UN);
            @fclose($fp);
        }
    }

    return $array;
}

lib/pukiwiki.php を以下のように変更。

123c123,125
<       $body  = convert_html(get_source($base));
---
> //    $body  = convert_html(get_source($base));
>       $body  = get_converted_html($base);
>       $foot_explain = get_notes($base);

最初、$body だけ保存するようにしたら、脚注が表示されなくなった。 convert_html() の中で脚注を作成していたので、 脚注部分も別ファイルとして保存するようにした。

実験結果

表示にかかる時間

整形ルールのページを表示するのに掛かった時間を以下に示す。

HTML convert time
改造前0.320 sec
改造後0.024 sec

このように HTML convert time はほぼゼロになる。 他の部分の処理もあるので表示にはそれなりに時間がかかるが、 逆にいえば、改良前の HTML convert time 分くらいは高速化される。 CPU が非力なマシンの場合や、 1ページにコンテンツを詰め込んでいる場合には、 効果を発揮するだろう。

消費するディスク容量

整形ルールのページのファイルサイズを以下に示す。

ファイル名ファイルサイズ
wiki/C0B0B7C1A5EBA1BCA5EB.txt28217 バイト
cache/C0B0B7C1A5EBA1BCA5EB.txt50394 バイト
cache/notesC0B0B7C1A5EBA1BCA5EB.txt855 バイト

大雑把に言って、2〜3倍くらいのディスク容量が必要になる。

問題点

保存された html 中に、動的に変化するはずの部分が若干ある。

  • 他のページの最終更新日

他の Wiki ページへのリンクは、以下のような html に変換される。

<a href="http://www.revulo.com/PukiWiki.html" title="PukiWiki (279d)">PukiWiki</a>

この (279d) という表示は、 リンク先のページが更新されてもそのままになってしまう。

  • プラグインの呼び出しを本文中で行っている場合

MenuBar やスキンに埋め込んでしまえるものは、 そちらに移動させればよいが、簡単には対応できない。

ToDo

  • バックアップからの復旧への対応

バックアップから戻した時とか、 そういう wiki/*.txt が書き変わる場合にも、 cache/*.html の更新を行う必要がある。

  • 他のページの最終更新日の問題

cache/*.html に書き込む際に、 一時的に $show_passage = 0; に設定すれば、 表示は寂しくなるが解決するはず。


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