最終更新: 2009-01-01 (木) 23:34:43
このページをDeliciousに追加 このページをはてなブックマークに追加 このページをlivedoor クリップに追加 このページをYahoo!ブックマークに追加

pagename_cache.php

サマリget_existpages() の高速化
リビジョン1.2
対応バージョン1.4.x
作者revulo
ライセンスGPLv2

目次

概要

PukiWiki には全ページ名のリストを得る get_existpages() という関数がありますが、 結構重い処理なので、キャッシュを活用することを考えてみます。

  • get_existpages() で得られるリストを、ファイルにキャッシュしておく
  • キャッシュが有効な間は、ページ名のリストはファイルから読み込む
  • 以下の場合にキャッシュを更新する
    • ページが新規作成された後
    • ページが削除された後
    • ページがリネームされた後

うまくいけば、get_existpages() を利用するプラグイン全般が高速化されるはずです。

動作環境

キャッシュ更新のタイミングを調べるために、 wiki ディレクトリの更新日時を利用しているので、 ファイルシステムによっては正常に動作しません。 ext3 や NTFS なら大丈夫だが、FAT32 だと恐らくダメ。 という制限がバージョン 0.2 まではありましたが、 現バージョンではその制限は取り除いてあります。

インストール

アーカイブファイルをダウンロードし、 PukiWiki をインストールしてあるディレクトリで展開します。

$ tar xvfz pagename_cache-1.2.tar.gz

PukiWiki 本体にパッチをあてます。

$ patch -p0 < pukiwiki-1.4.7_pagename_cache.diff

パッチがうまくあたらない場合は、手作業で以下のような修正を加えて下さい。

  • lib/pukiwiki.php
    • 先頭部分で lib/pagename_cache.php を require
  • lib/file.php
    • file_write() で新規作成や削除の直後に pagename_cache_update() を呼ぶ
    • get_existpages() でキャッシュが on なら代わりに pagename_cache_get_existpages() の値を返す
  • plugin/rename.php
    • plugin_rename_proceed() でリネームの直後に pagename_cache_update() を呼ぶ

設定

pagename_cache.php の先頭部分で以下の値を設定することで、動作をカスタマイズできます。

PKWK_PAGENAME_CACHE_FILE
キャッシュのファイル名
PKWK_PAGENAME_STRICT_CHECK
ftp でファイルを追加したりした場合にも、ページ名のリストが正しく得られるようにします。 ただし動作は若干遅くなります。 また、機能するかどうかはファイルシステムに依存します (動作環境の項を参照)。

ベンチマーク

以下のようなコードを実行し、 get_existpages() を 1000 回呼び出した時の所要時間を計ってみました。

    $time1 = getmicrotime();
    for ($i = 0; $i < 1000; $i++) {
        unset($pages);
        $pages = get_existpages();
    }
    $time2 = getmicrotime();
    echo $time2 - $time1;

実験を行った環境は以下の通りです。

  • VMware Workstation for Windows 5.5.2
  • CPU: Athlon 64 3000+
  • メモリ: 256 MB
  • OS: Debian Sarge
  • Apache: 2.0.54
  • PHP: 5.1.2
  • PukiWiki: 1.4.7
  • ページ名は dummy/ で始まるランダムなアルファベット20文字

測定の結果は以下のようになりました。 (この結果はバージョン 1.1 のもので、バージョン 1.2 だともう少し速いはずです。)

ページ数改良前 [s]改良後 [s]
1001.861
2.039
2.027
0.273
0.288
0.287
100019.552
19.698
19.824
2.379
2.242
2.218
10000200.227
200.874
200.723
24.436
24.607
24.850

ページ数によらず約8倍の高速化になっています。 ただし VMware 上での測定結果なので、数字はあくまでも参考値として見て下さい。

ダウンロード

バージョン 0.2 以前の方法にも捨てがたいものがありますので、バージョン 0.2 のファイルも置いておきます。

  • pagename_cache-1.2.tar.gz
    • ライブラリ本体
    • PukiWiki を pagename_cache に対応させるパッチ
      • PukiWiki 1.4.7 用
      • PukiWiki 1.4.6 用

更新履歴

  • Version 1.2 (2009/01/01)
    • get_existpages() が一度呼ばれたら static 変数にリストを保存しておくように変更
    • キャッシュに保存する前に、ページ名のリストを ksort() でソートしておくように変更 *1
    • 不要な flock(), ignore_user_abort() を削除
    • コードの整理
  • Version 1.1 (2006/11/04)
    • キャッシュファイルのパスを設定しやすいようにコードを整理
  • Version 1.0 (2006/11/03)
    • ファイル書き込みの処理を厳密に
  • Version 0.3 (2006/11/02)
    • キャッシュ更新のタイミングを変更し、さらに高速化
  • Version 0.2 (2006/11/01)
    • fopen に失敗した場合の対策を強化
  • Version 0.1 (2006/10/31)
    • 試しに作ってみた
*1 get_existpages() の結果はソートして利用されることが多いので、予めソートしておくと高速化できます。

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