PHP/Optimizer
phpでは、実行の際、スクリプトを中間言語に変換してから、実行するという手順が取られ、実行後、その中間言語形式のものは破棄されるらしい。詳細については、他で探してもらうとして、ここでは、キャッシュを用いた Optimizer (正確には、opcode cacher?)の比較をする。
種類 †
- APC(Alternative PHP Cache)
- PECLに含まれる。
Yahooも使っているらしい。 - eAccelerator
- Trunk MMCacheが元になっている。
- xcache
- 新たに作られたcacher。
- ionCube PHP Accelerator
- Yahooが使ってるのはこっちだった。暇があったらベンチマークしてみよう。…と思ったが、バージョン5.xには未対応だ。
- Zend Optimizer
- PHPの開発にも貢献している、Zend社のOptimizer。名前のとおり、これは他のものと違って、ソースコードの最適化を行ってくれるものだが、今回の比較対象とした。
これらは、基本的に併用は不可 eAccelerator と Zend Optimizer, XCache と Zend Optimizer は併用することが可能。
インストール †
_ APC
PECL からソースを持って来る。最新版は、3.0.16。
% tar zxf APC-3.0.10.tgz % cd APC-3.0.10 % phpize % ./configure --with-gnu-ld --enable-apc --enable-apc-mmap --enable-apc-sem
Apacheなら、httpd.hのあるディレクトリを /usr/include/apache2 として、
% export CPPFLAGS="-I/usr/include/apache2 -DAPC_PHP4_STAT" % ./configure --with-gnu-ld --enable-apc --enable-apc-mmap --enable-apc-sem --with-apxs=/usr/sbin/apxs2
% make # make install
php.iniへ、APCの設定を追加。場所は、; Dynamic Extensions ; のところへ。
[apc] extension=apc.so apc.mode = mmap apc.cachedir = "/var/cache/apc" apc.check_mtime = 1 apc.shm_size = 30 apc.optimization = 1 apc.ttl = 43200 apc.check_compiled_source = 1
apc.shm_size のデフォルト値は30MB(?)らしい。単位はMB。また、 apc.cachedir で指定したところに、 httpd の実行ユーザで書き込めるディレクトリを作っておくこと。
以上で設定は終了。必要ならhttpdをリスタートする。
_ eAccelerator
http://eaccelerator.net/ からソースをダウンロード。
% tar zxf eaccelerator-0.9.5.2.tar.gz % cd eaccelerator-0.9.5.2 % phpize % ./configure --enable-eaccelerator=shared % make # make install
php.iniへ、eAcceleratorの設定を追加。場所は、 ; Dynamic Extensions ; のところへ。
[eaccelerator] zend_extension=/usr/lib/php4/.../eaccelerator.so eaccelerator.shm_size="0" eaccelerator.cache_dir="/var/cache/eaccelerator" eaccelerator.enable="1" eaccelerator.optimizer="1" eaccelerator.check_mtime="1" eaccelerator.debug="0" eaccelerator.filter="" eaccelerator.shm_max="0" eaccelerator.shm_ttl="0" eaccelerator.shm_prune_period="0" eaccelerator.shm_only="0" eaccelerator.compress="1" eaccelerator.compress_level="9" eaccelerator.keys="shm_and_disk" eaccelerator.sessions="shm_and_disk" eaccelerator.content="shm_and_disk"
eaccelerator.shm_size は、0とするとデフォルト値が適用される。phpinfo を確認して、必要があれば増やす。単位はMB。闇雲に大きくしても、使用メモリを増やすだけとなるので注意。また、 eaccelerator.cache_dir で指定したところに、httpdの実行ユーザで書き込めるディレクトリを作っておくこと。 eaccelerator.compress="1", eaccelerator.compress_level="9" は、それぞれ最大で圧縮となっているが、無効にした方がよい場合もあると思うので、要調整。
以上で設定は終了。必要ならhttpdをリスタートする。
_ xcache
ここ から最新ソースをダウンロード。
% tar zxf xcache-1.2.2.tar.gz % phpize % ./configure --enable-xcache % make # make install
php.iniへ、xcache の設定を追加。場所は、; Dynamic Extensions ; のところへ。
[xcache] zend_extension="/usr/lib/php4/.../xcache.so" xcache.cacher = On xcache.size = 20M xcache.count = 1 ;xcache.slots = 20k xcache.optimizer = On xcache.mmap_path = "/tmp/xcache" xcache.var_size = 20M xcache.var_count = 1 ;xcache.var_slots
xcache.size の単位はMB。また、 xcache.mmap_path で指定したディレクトリは、プログラム実行時に自動的に作成されるらしいので、親ディレクトリが実行ユーザで書き込めるようになっている必要がある。しかも、あらかじめ作成してあるとエラー終了する。
PHP Fatal error: XCache: Cannot create shm in Unknown on line 0 PHP Fatal error: XCache: Cannot init in Unknown on line 0 PHP Fatal error: Unable to start XCache module in Unknown on line 0
何て仕様だ。
以上で設定は終了。必要なら httpd をリスタートする。
_ ionCube PHP Accelerator
ここからダウンロードし、展開。なお、php-5.xにはまだ対応していないようだ。
% tar zxf php_accelerator-1.3.3r2_php-4.4.0_linux_i686-glibc2.1.3.tgz % cd php_accelerator-1.3.3r2_php-4.4.0_linux_i686-glibc2.1.3
ライブラリを適当なディレクトリへコピー。
% cp php_accelerator_1.3.3r2.so /usr/lib/php4/lib/php/extensions/no-debug-non-zts-20020429/
php.ini へ、以下を追加。
zend_extension="/path/to/php_accelerator_1.3.3r2.so" phpa = on phpa.tweaks = on phpa.cache_dir = /tmp phpa.file_perms = 400 phpa.cache_file_prune_period = 1h phpa.cache_file_ttl = 1d phpa.shm_size = 8 phpa.shm_perms = 666 phpa.shm_release_at_exit = on phpa.shm_stats_check_period = 5m phpa.shm_ttl = 12h phpa.shm_max_processes = 512 phpa.shm_lock_threshold0 = 10 phpa.shm_lock_threshold1 = 10
以上で終了。ちなみに、上のコンフィグ値は全てデフォルト。詳細は、CONFIGURATION に説明があるので、そちらを参照のこと。
キャッシュサイズ(phpa.shm_size)については、付属するプログラム、
% phpa_cache_admin -mv
でのメモリ使用量に応じて増やすべし、ということだ。
_ Zend Optimizer
Zend Japan からダウンロード。会員登録が必要。
% tar zxf ZendOptimizer-3.0.0-linux-glibc21-i386.tar.gz % cd ZendOptimizer-3.0.0-linux-glibc21-i386 # ./install.sh
あとは、インストーラに従ってインストール。設定まで行ってくれる。必要ならhttpdをリスタートする。なお、--enable-versioningを指定してコンパイルしていると、動かないようだ。
また、eaccelerator, xcache と併用する場合は、Zend Optimizer の設定を後に記述する。
比較 †
このwikiの Lighttpd の旧ページへアクセスした時間を計測。サーバは、VMware(memory 160MB) 上の lighttpd (Debian Sarge)。ホストは、 AthlonXP1700+/512MB (Gentoo Linux)。比較として、eAccelerator には、圧縮なしの条件も加えた。
_ 200回アクセス(同時アクセス数1)
% /usr/sbin/ab2 -n 200 -c 1 "http://pinga.mini13i.gotdns.org/linux/?Lighttpd"
| none | APC-3.0.10 | Zend-3.0 | eAccel-0.9.4 | eAccel-0.9.4(圧縮なし) | xcache | eAccel + Zend | eAccel + Zend(圧縮なし) | |
| 最短 | 296 | 240 | 314 | 266 | 269 | 245 | 291 | 295 |
| 平均 | 310 | 321 | 345 | 286 | 289 | 264 | 317 | 321 |
| 最長 | 417 | 1683 | 654 | 424 | 437 | 494 | 376 | 475 |
_ 500回アクセス(同時アクセス数5)
% /usr/sbin/ab2 -n 500 -c 5 "http://pinga.mini13i.gotdns.org/linux/?Lighttpd"
| none | APC-3.0.10 | Zend-3.0 | eAccel-0.9.4 | eAccel-0.9.4(圧縮なし) | xcache | eAccel + Zend | eAccel + Zend(圧縮なし) | |
| 最短 | 621 | 556 | 664 | 600 | 500 | 513 | 744 | 1027 |
| 平均 | 1714 | 1278 | 1644 | 1499 | 1436 | 1302 | 1589 | 1590 |
| 最長 | 4375 | 1762 | 2159 | 3405 | 1959 | 2498 | 2128 | 3736 |
うーん、微妙な結果。どれ使おう…。PHPのバージョン、キャッシュサイズやコンテンツ、ボトルネック等によって結果は変化してくるはず。
ただ、一番 CPU への負荷が小さいのは圧縮なしの eAccelerator。これは、MMX Pentium 133 で試したときに一番パフォーマンスが良かったため。。
参考 †
- Benchmarking PHP accelerators - iPerSec
- PHP Bytecode Cacher Review October 2006
- eAccelerator/APC/xcacheのパフォーマンス比較再び - Do You PHP


