Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2005/02/16

counter hits
since 1999/11/06


Turck MMCacheを導入してみる - キャッシュでパフォーマンスUP

caution[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.ini
mmcache.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で確認します。以下のような内容が表示されているはずです。

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なし MMCacheあり
約150KB 0.02213 0.00492
約406KB 0.04931 0.00326
約541KB 0.07450 0.01491

また、MMCacheにはWeb向けのAPIも用意されています。以下のようなスクリプトを用意し、

●mmcache.php

<?php
    mmcache();
?>

ブラウザからアクセスすると以下のような画面が表示されます。ここでは、MMCacheの稼働状況やキャッシュのクリアなどが行えます。

mmcache

もう一つ、Turck MMCache APIと呼ばれる拡張関数が用意されていますが、それはまたの機会ということで(^-^;



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2005 by Hideyuki SHIMOOKA all rights reserved.