|
[2005/02/11] ITProのPHPウォッチによるとプロジェクトは停止状態にあり、新プロジェクトとしてeAcceleratorプロジェクトが開始されています。近いうちにまた調べてみようと思います。
個人的には細々とPHPを続けていましたが、ひょんな事から仕事で再びPHPを使う機会を得ました。役割としてはパフォーマンスチューニングなのでPHP以外にDBやインフラまわりも見ることになったのですが、PHPの実行がやたら遅い。調べてみると、どうもrequire/includeの実行で遅いと分かったのですが、実際にrequire/includeするファイルのサイズを見て愕然。。。数百KBもあるじゃん!そりゃ、遅いわなぁ( ̄Д ̄;)
ということで、
- オープンソースで提供されている
- PHPファイル(できれば、パース結果)をメモリ上にキャッシュする
- PHPファイルを更新すると再読込し、キャッシュし直す
- PHP自体を再buildしたくないので、PHP拡張モジュールとして提供されている
という条件を満たすTurck MMCacheを(今更ながら)導入してみました。
起源は意外と古く2001年に最初のリリースがあり、2004/10/31現在最新版であるバージョン2.4.6はリリースが2003/11/04と比較的*枯れた*モジュールのようです。また、キャッシュ機能だけではなく、PHPスクリプトの最適化(オプティマイザ)や暗号化(エンコード)機能も用意されています。
まずはインストールです。以下のようなお決まりの手順でインストールします。
$ tar jxf turck-mmcache-2.4.6.tar.bz2
$ cd turck-mmcache-2.4.6
$ phpize
$ ./configure --enable-mmcache
$ make
$ su -
# make install
#
インストール後、php.iniに以下の内容を追加します。
●php.ini;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; for MMCache
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20020429/mmcache.so"
;通常のextensionでも可
;extension="/usr/local/lib/php/extensions/no-debug-non-zts-20020429/mmcache.so"
mmcache.enable="1"
mmcache.optimizer="1"
mmcache.shm_size="16"
mmcache.cache_dir="/tmp/mmcache"
mmcache.check_mtime="1"
mmcache.debug="0"
mmcache.filter=""
mmcache.shm_max="0"
mmcache.shm_ttl="0"
mmcache.shm_prune_period="0"
mmcache.shm_only="0"
mmcache.compress="1"
ここでは、以下のような設定にしています。詳細はConfiguration Optionsの章を参照してください。
- MMCache(mmcache.enable)を有効にする
- オプティマイザ(mmcache.optimizer)を有効にする
- 使用メモリの上限(mmcache.shm_size):16MB
- ディスクキャッシュする際のディレクトリ(mmcache.cache_dir):/tmp/mmcache
- PHPファイルの更新チェック(mmcache.check_mtime)を有効にする
- 共有メモリだけにキャッシュ(mmcache.mmcache.shm_only)しない(ディスクキャッシュも併用する)
- キャッシュの圧縮(mmcache.compress)を有効にする
ちなみに、
●php.inimmcache.shm_only="1"
とした場合、ディスクキャッシュが無効になりますので、mmcache.cache_dirで指定したディレクトリにキャッシュファイルは作成されません。今回は、ディスクキャッシュを併用する事にしたので、キャッシュ用ディレクトリを作成しておきます。ownerは、Apacheのhttpd.confのUserディレクティブで指定したユーザー(cli版を使用する場合は実行ユーザー)とし、それ以外のユーザーで読み書きできないようにしておきます。
# mkdir /tmp/mmcache
# chown nobody /tmp/mmcache
# chmod go-rwx /tmp/mmcache
#
ここまでできたら、Apacheの再起動を行い、phpinfoで確認します。以下のような内容が表示されているはずです。
さて、効果測定ですが以下の環境でテストしました。
- Pentium4 3.0GHz
- 1.0GB Mem
- Vine Linux 3.0 (kernel 2.4.26-smp)
- Apache 2.0.52 + PHP 4.3.9
- PHPスクリプトのrequire/includeする前後に「echo microtime();」を埋め込み、所要時間を計測(手抜きだ。。。)
実際の結果ですが、以下の通りとなりました。表の最左は、require/includeするファイルの合計サイズです。require/includeの所要時間だけで数~十数倍程度の速度向上が見られました。ブラウザからアクセスしても、「あれ?ちょっと早い?」と体感できる程度です。
また、MMCacheにはWeb向けのAPIも用意されています。以下のようなスクリプトを用意し、
●mmcache.php
<?php
mmcache();
?>
ブラウザからアクセスすると以下のような画面が表示されます。ここでは、MMCacheの稼働状況やキャッシュのクリアなどが行えます。
もう一つ、Turck MMCache APIと呼ばれる拡張関数が用意されていますが、それはまたの機会ということで(^-^;
|