このページをDeliciousに追加 このページをはてなブックマークに追加 このページをlivedoor クリップに追加 このページをYahoo!ブックマークに追加

* pagename_cache.php [#de84783b]

|RIGHT:120|LEFT:360|c
|~サマリ|get_existpages() の高速化|
|~リビジョン|1.1|
|~リビジョン|1.2|
|~対応バージョン|1.4.x|
|~作者|revulo|
|~ライセンス|GPLv2|


** 目次 [#nd8166b2]

#contentsx


** 概要 [#c729b981]

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

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

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


** 動作環境 [#j61d063d]

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


** インストール [#l098420a]

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

 $ tar xvfz pagename_cache-1.1.tar.gz
{{{
$ tar xvfz pagename_cache-1.2.tar.gz
}}}

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

 $ patch -p0 < pukiwiki-1.4.7_pagename_cache.diff
{{{
$ 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() の値を返す
- lib/pukiwiki.php
-- 先頭部分で lib/pagename_cache.php を require

- plugin/rename.php
-- plugin_rename_proceed() でリネームの直後に pagename_cache_update() を呼ぶ


** 設定 [#h7f9dde3]

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

:PKWK_PAGENAME_DIR|
キャッシュを置くディレクトリ

:PKWK_PAGENAME_FILE|
:PKWK_PAGENAME_CACHE_FILE|
キャッシュのファイル名

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



** ベンチマーク [#i1b55097]

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

{{{ php
    $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文字

実験の結果は以下のようになった。ページ数によらず約8倍の高速化になっている。
ただし VMware 上での測定結果なので、数字はあくまでも参考ということで見て欲しい。
測定の結果は以下のようになりました。
(この結果はバージョン 1.1 のもので、バージョン 1.2 だともう少し速いはずです。)

|CENTER:	|RIGHT:				|RIGHT:				|c
|ページ数	|改良前 [s]			|改良後 [s]			|h
|100		|1.861&br;2.039&br;2.027	|0.273&br;0.288&br;0.287	|
|1000		|19.552&br;19.698&br;19.824	|2.379&br;2.242&br;2.218	|
|10000		|200.227&br;200.874&br;200.723	|24.436&br;24.607&br;24.850	|

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


** ダウンロード [#h7d4ee9c]

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

- [[pagename_cache-1.1.tar.gz>http://download.revulo.com/counter/lime.xcg?down=http://download.revulo.com/PukiWiki/pagename_cache-1.1.tar.gz]]
- pagename_cache-1.0.tar.gz
- pagename_cache-0.3.tar.gz
- [[pagename_cache-1.2.tar.gz>http://download.revulo.com/counter/lime.xcg?down=http://download.revulo.com/PukiWiki/pagename_cache-1.2.tar.gz]]
-- ライブラリ本体
-- PukiWiki を pagename_cache に対応させるパッチ
--- PukiWiki 1.4.7 用
--- PukiWiki 1.4.6 用

- [[pagename_cache-0.2.tar.gz>http://download.revulo.com/counter/lime.xcg?down=http://download.revulo.com/PukiWiki/pagename_cache-0.2.tar.gz]]
- pagename_cache-0.1.tar.gz
-- ライブラリ本体
-- PukiWiki を pagename_cache に対応させるパッチ


** 履歴 [#n3ea58d2]
** 更新履歴 [#n3ea58d2]

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


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