今回は、PHPの処理速度を簡単に上げることができるモジュール、eAccelerator をご紹介します。 eAcceleratorはスクリプトを最適化しコンパイルされた状態でキャッシュするこ とで、スクリプト実行速度を飛躍的に上昇させます。(付属の説明によると最大 10倍!) では、早速インストール手順を説明します。
apache1.3以上、mod_php4.1以上、autoconf、automake、libtool、m4が必要です が、大抵の環境では条件を満たしていると思います。万が一足りないものがあっ たらインストールして下さい。 なお、CGIモードのPHPではeAcceleratorを使うことはできません。
1.ソースの入手、解凍、展開
http://sourceforge.net/projects/eaccelerator/ からソースコードをダウンロードします。現在の最新版はバージョン0.9.5で す。(2006/10/31現在) ダウンロードしたら、適当な場所(例えば/usr/local/srcなど)に移して解凍、 展開します。
2.configure、make、make install
次に、展開したディレクトリに移動して、以下のようにconfigure、makeを実行 します。 以下のexportコマンドはbashで、PHPが/usrにインストールされている場合です。 環境に合わせて適宜変更して下さい。
export PHP_PREFIX="/usr"
$PHP_PREFIX/bin/phpize
./configure --enable-eaccelerator=shared \
--with-php-config=$PHP_PREFIX/bin/php-config
make
sudo make install
3.インストール後の設定
インストールができたら、設定を行います。 通常はphp.iniに設定を追加します。 /etc/php.dがある場合は、eaccelerator.iniをコピーし、必要に応じて編集します。
eAcceleratorはZend、PHPどちらのエクステンションとしてもインストールでき ます。 ここではPHPのエクステンションとしての設定例を紹介します。 以下の記述をphp.iniに追加します。
extension="eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/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.cache_dir で指定したディレクトリにキャッシュが保存されます。このディレクトリは予め 作っておく必要があります。
mkdir /tmp/eaccelerator
chmod 0777 /tmp/eaccelerator
4.動作確認
設定できたら、apacheを再起動して実際にeAcceleratorが動いているか確認します。 確認する方法はいろいろあります(phpinfo()を見てみる、デバッグモードにして ログの確認など)が、 今回は先ほど作ったキャッシュ用のディレクトリを見てみましょう。 ディレクトリ内に更に階層のディレクトリが作成されていて、キャッシュデータ が作られているのが確認できるはずです。
以上で完了です。これだけでスピードアップできるので、興味のある方はぜひ試 してみて下さい。
最後に、本当のところどれくらい速度が上がるのか、手近なスクリプトで試した 結果を紹介しておきます。 テストにはapacheに付属しているベンチマークプログラム、abを使用し、接続数 1000、同時接続数10で実験しました。 abは
ab -n 1000 -c 10 http://hogehoge.com/index.php
のように使います。
また、試したのは自作のプログラム2つです。 両方ともテンプレートエンジンにSmartyを使用しており、データベースから持っ てきたデータを一覧で表示するプログラムです。 1つ目のプログラムにはforeachなどで合計数千回のループ処理を行っていま す。(2つ目は20回くらい) 以下、結果の一部です。
1つ目のプログラム eAcceleratorなし
Time taken for tests: 122.555273 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 180828000 bytes
HTML transferred: 180444000 bytes
Requests per second: 8.16 [#/sec] (mean)
Time per request: 1225.553 [ms] (mean)
Time per request: 122.555 [ms] (mean, across all concurrent requests)
Transfer rate: 1440.89 [Kbytes/sec] received
1つ目のプログラム eAcceleratorあり
Time taken for tests: 84.62285 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 180828000 bytes
HTML transferred: 180444000 bytes
Requests per second: 11.90 [#/sec] (mean)
Time per request: 840.623 [ms] (mean)
Time per request: 84.062 [ms] (mean, across all concurrent requests)
Transfer rate: 2100.69 [Kbytes/sec] received
2つ目のプログラム eAcceleratorなし
Time taken for tests: 51.725834 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 7345000 bytes
HTML transferred: 6939000 bytes
Requests per second: 19.33 [#/sec] (mean)
Time per request: 517.258 [ms] (mean)
Time per request: 51.726 [ms] (mean, across all concurrent requests)
Transfer rate: 138.65 [Kbytes/sec] received
2つ目のプログラム eAcceleratorあり
Time taken for tests: 25.616275 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 7345000 bytes
HTML transferred: 6939000 bytes
Requests per second: 39.04 [#/sec] (mean)
Time per request: 256.163 [ms] (mean)
Time per request: 25.616 [ms] (mean, across all concurrent requests)
Transfer rate: 279.98 [Kbytes/sec] received
Requests per secondの値が一秒あたりの処理数で一番分かりやすいと思います。
1つ目のプログラムでは、
8.16 → 11.90 (約1.46倍)
2つ目のプログラムでは
19.33 → 39.04 (約2.02倍)
と、確かに早くなっていることが確認できました。
この記事は、アシアルが運営するPHP開発者のためのポータル&コミュニティサイト「PHPプロ!」で毎週配信しているPHP・TIPSメーリングリストを再録したものです。
同サイトでは、他にもPHP最新ニュースや、困ったときのQ&A掲示板、初心者向けのPHP講座など、PHP開発者をサポートする情報を掲載しています。