HTML ページキャッシュ用のプラグイン wp-cache に続いて、PHP アクセラレータの中から APC (Alternative PHP Cache) を導入、効果を計測してみました。

WordPress: APC ありとなしの比較

動作環境

  • CentOS 5.3
  • PHP 5

PHP を高速化する PHP アクセラレータ

wp-cache は、最終的に生成された HTML ページコンテンツをキャッシュしておくためのプラグインでしたが、APC は名前の通り PHP に対してはたらく「PHP アクセラレータ」です。

PHP はサーバサイドで動作するスクリプト言語ですが、バイトコード1 に変換し実行しています。Perl もそうです。

WordPress も PHP で書かれた巨大なスクリプトのカタマリですが、毎回同じ *.php スクリプトを構文解釈、バイトコードに変換、とやっているから遅くなります。一回バイトコードになったものは、やはり期限付きでキャッシュしておけば、二度手間が省けて早いじゃん、というのがバイトコードキャッシュです。

PHP アクセラレータは、バイトコードキャッシュと、さらにバイトコードの無駄を省いて最適化するといった付加機能を持っています。代表的なものに APC, eAccelerator, XCache があります。どれにするか悩みどころですが、APC は

私の場合は、インストールのしやすさ、パフォーマンスと安定性の点で評判の高い APC を使ってみました。

APC のインストール

インストールしやすいとは言っても、yum 一発で終了というわけにはいかず。まず pecl3 が動作するために必要なライブラリを yum っておき、pecl を通じて APC をインストール、と二段構えになります。

下記は pecl で必要そうなものをまとめて yum するように書いていますが、gcc, httpd-devel といった基本的なものは、すでに入っている可能性が高いかもしれません。

[code]
# yum -y install php-devel php-pear gcc httpd-devel
# pecl install apc
downloading APC-3.0.19.tgz …
Starting to download APC-3.0.19.tgz (115,735 bytes)
…..
Use apxs to set compile flags (if using APC with Apache)? [yes] :
…..
Build process completed successfully
Installing ‘/var/tmp/pear-build-root/install-APC-3.0.19//usr/lib/php/modules/apc.so’
install ok: channel://pecl.php.net/APC-3.0.19
You should add "extension=apc.so" to php.ini
[/code]

php.ini に一行書き加えろと言われますが、ここではメンテ性を考えて /etc/php.d に個別の .ini ファイルとして追加します。最後に httpd を再起動して終了。

[code]
# echo "extension=apc.so" >/etc/php.d/apc.ini
# /etc/init.d/httpd restart
[/code]

分かってしまえば手順はこれだけです。

APC が組み込まれたことを確認

名前はなんでも良いですが、以下のような test.php を仮に作成し、http://……./test.php でアクセスしてみます。

[code language=”php”]
<?php phpinfo(); ?>
[/code]

だらだら長い info の中から “apc” のセクションを探して、

APC Support: Enabled

Enabled となっていれば OK。phpinfo(); は誰からでも読める状態だと、セキュリティ上好ましくないため消しておきます。

[code]
# rm test.php
[/code]

APC の効果は?

体感的に一番デカいのは、WordPress の管理画面が速くなることでしょう。投稿の一覧、「画像を追加」のポップアップ、すべてがキビキビと動くようになります 🙂 一度入れてみるともう APC なしには戻れません。

では、ブログの読者からはどうなのか。

wp-cache と同様、http://www.nire.com/ トップページをリクエストして、結果が帰ってくるまでの時間を “ab” で計測してみました。

WordPress: APC ありとなしの比較

キャッシュがない状態での所要時間を 100% として、APC があると 82.75% と、2割近くの時間短縮です。

wp-cache があれば、できあがった HTML コンテンツをキャッシュから送り出すだけだから、APC なんて余計なもの要らないのでは? という仮説もあると思うので、wp-cache + APC 併用をさらに比較。

WordPress: wp-cache 単体と、APC 併用の比較

キャッシュなしを同様に 100% とすると、wp-cache 単体で 0.25% かかっていたのが、wp-cache + APC では 0.11% と、半分の時間になります。

速くなるのは嬉しいのですが、ちょっと不思議ですね。ということで、次回に続く。


  1. Bytecode: 中間コードなどとも呼ばれる []
  2. ここはもう少し評価が必要か []
  3. PHP Extension Common Library. Perl で用意されている CPAN みたいなもんでしょうか []