APCを使って実行効率を上げる
PHPには数種類のアクセラレータがある。仕組みはPHPスクリプトのコンパイル結果(バイトコード)をファイルだったり共有メモリだったりにキャッシュしておいて、次回以降のコンパイル分処理効率を向上させる、という仕組み。
ちょっと古い記事だがGIGAZINEに比較記事があり、リンク先ではベンチマーク結果が公表されていた。その中から「成績がよい」「ドキュメントが和訳されてる」「2008年にstableリリースがある」という理由でAPC(Alternative PHP Cache)を選択した。
●インストール
peclコマンド一発。
# pecl install APC
…で済めばいいが、あまりアテにせず地道にソースコードからインストール。
$ tar xzf APC-3.0.19.tgz $ cd APC-3.0.19 $ phpize $ ./configure --with-pic --enable-apc $ make $ su - # make install
configureオプションについてはこの記事を元に調査したが、最新バージョン(3.0.19)では何も指定しないと「Locking type = pthread mutex Locks」になる(phpinfoで確認)。
–with-picはおまじないで構わない。理由についてはこの記事で勉強できる。
拡張モジュール本体はなんだか落ち着かないディレクトリに生成されるのでsymlinkを作っておくとよいだろう。
$ pwd /usr/local/lib/php/extensions $ ln -s no-debug-non-zts-20060613/apc.so
●設定
php.iniの設定は以下のような感じ。
[apc] extension=apc.so apc.enabled=1 # ↓APCが確保する共有メモリのサイズ(MB)。サーバスペックにあわせて適切に。 apc.shm_size=128 apc.include_once_override=1 apc.cache_by_default=1 apc.ttl=86400 apc.user_ttl=86400 apc.gc_ttl=86400
オプションの一覧と意味はドキュメント参照。webサーバをリスタートしたら完了。
●効能とチューニング
ソースを展開したディレクトリの「apc.php」をドキュメントルートにコピーするとキャッシュ状況をチェックできる。キャッシュ状況のグラフ表示にはGD2が必要。共有メモリを使い切っているようだったらapc.shm_sizeを大きくしよう。
ベンチマーク取る手間は省略(いそがしいので)。片隅のwebサーバに導入して、一晩寝かせてみた。
おお、なかなか素晴らしい。
●まとめ
物理メモリがキツくてアップアップしてるサーバには難しそうだが、導入する価値は非常に高い。副作用もいまのところない。さらにAPCが確保してる共有メモリを読み書きする関数も用意されているので、ほかの用途にも使えそうな気配がそこはかとなく漂う。レンタルサーバに導入するのは無理がありそうだが、自前のサーバで運用しているサービスの負荷軽減にはもってこいのextensionだろう。
【参考リンク】
PECL :: Package :: APC PHP: APC – Manual
PHPアクセラレータで一番高速なのはどれか? – GIGAZINE
PHP Bytecode Cacher Review October 2006
れぶろぐ – [PHP] PECL::APC をさらに高速化するための設定
Linux の共有ライブラリを作るとき PIC でコンパイルするのはなぜか – bkブログ