いまさらAPCをインストールして、PHPの実行を高速化してみた

APC(Alternative PHP Cache)とは

Alternative PHP Cache (APC) は、PHP の実行コードをキャッシュする仕組みで、 フリーかつオープンに使用できます。PHP の中間コードのキャッシュ・最適化を行うための、 フリーでオープンかつ堅牢なフレームワークを提供するということを目標としています。 ( PHP: 導入 - Manual )

スクリプトを起動するたびに、実行コードにコンパイルしている部分を、元のスクリプトに変更が無い限り(※)キャッシュして使い回すカタチで、PHPの全般的な実行を高速化する仕組みです。

※スクリプトの変更の有無を確認する・しないのオプション ( apc.stat ) も別途で存在し、それを確認しないようにすると、その分さらにパフォーマンスが向上します。

今回は、さくらのVPS標準のCentOS 5.5と、「とあるさくらのVPS (5) 標準のCentOS 5.5で、PHPを5.1.6から5.2.xにする」でアップデート済みのPHP5.2.14の組み合わせで動作を確認しています。

早速yumでインストール

% yum search apc
iasl.x86_64 : Intel ASL compiler/decompiler
perl-Mail-IMAPClient.noarch : An IMAP Client API
php-pecl-apc.x86_64 : APC caches and optimizes PHP intermediate code

yumにapcが含まれているか確認したところ、php-pecl-apcとして発見。これをインストールします。

% sudo yum install php-pecl-apc
Running Transaction
  Installing     : php-pecl-apc                                                                                     1/1

Installed:
  php-pecl-apc.x86_64 0:3.1.2-1.el5.art                                                                                

Complete!

これですぐに有効になります。自分は、念のためhttpdをrestartしました。インストール直後に、php.iniにextension=apc.soと追記したら応答しなくなってしまいました。yumで入れた瞬間からすでに有効なようです。

phpinfoで確認する

phpinfo()で確認すると、以下のようにAPCの項目が確認できます



APCの管理画面を使おう

APCには管理画面スクリプトが含まれています、apc.phpという名前らしいので探してみます。

% sudo find / -name apc.php
/usr/share/doc/php-pecl-apc-3.1.2/apc.php

% cd /usr/share/doc/php-pecl-apc-3.1.2
% cp apc.php /hogehoge/public_html/apc.php

発見できたapc.phpを、公開ディレクトリにコピーします。

apc.phpと同じディレクトリにapc.conf.phpという名前で、以下の内容のファイルを作成します。

<?php

if ( !in_array(@$_SERVER['REMOTE_ADDR'], array('xxx.xxx.xxx.xxx', 'xxx.xxx.xxx.xxx')) ) die();

defaults('ADMIN_USERNAME','user');
defaults('ADMIN_PASSWORD','password');

ユーザー名とパスワードは任意で設定。自分は念のため簡易で、IP制限も追加しました。

APCの稼働状態をブラウザからモニタできます

apc.phpにアクセスすると、下のような画面が表示されるようになります。



なんだか面白いですね。一番右のHits&Missesは、キャッシュ済みのPHPが実行された率と、まだキャッシュされていないPHPが実行された率と思われます。実行後しばらしくしたら、あっという間に今のような状態になりました。

サーバー自体のステータスを見ても、自分の環境だと導入前と比べてメモリ使用量が25%減になりました。メモリ周りだけを見る分には、なかなかめざましい効果をあげています。

追記:勘違いだった気がしてきたので消しておきます。体感速度は上がってるんですが、メモリの使い方が変わっただけなのような。

もうちょっと負荷の高い自前のコンテンツを持って、効果の程を確認してみたいですね。(このブログはそんなにアクセスないので...)

今度は、最適化の効果を確認できるベンチマーク手法も調べないと。これから先、導入の効果を分かりやすく、レスポンスタイムの推移を実測データで示せるようにしたいところ。何か良いの無いかな? ではでは。

参考サイト

Wordpressだと管理ページでめざましい効果があがるらしいです。ふむふむ。