WordPressの表示速度が遅いので、出来る範囲でチューニングをすることができないかと調べてみたところ、さくらの共有サーバーは自分でコンパイルすればAPCを組み込めるという話を聞いたので組み込んでみることにした。
[コンパイルの手順]
当然のことながら共有サーバーなのでPECLコマンドでは、ホームディレクトリ以外への書き込み権限が無いためインストールすることができない、まずはソースコードを入手して展開する。
cd $HOME
mkdir src
cd src
wget http://pecl.php.net/get/APC-3.1.9.tgz
tar -zxvf APC-3.1.9.tgz
ソースコードからコンパイルする。その際with-php-configオプションで今使っているバージョンのPHPを指定する。
cd APC-3.1.9
phpize
./configure --with-php-config=/usr/local/php/5.3.9/bin/php-config
make
make test
make installは、前述のとおりホームディレクトリ以外に書き込み権限が無いため実行ができない。そこでホームディレクトリに適当にphp-modulesというディレクトリを作ってそこに出来上がったモジュールをコピーする。
cp $HOME/src/APC-3.1.9/modules/apc.so $HOME/php-modules/
[php.iniの設定]
次に、ドキュメントルートにphp.iniを作ってモジュールを読み込ませる。せっかくなのでphp.iniにAPCの設定をするついでにPHP本体のチューニングのための設定をすることにした。
realpath_cache_sizeが標準の値16kだと少なめなので少し増やす。
PHP が使用する realpath キャッシュの大きさを設定します。 PHP で大量にファイルをオープンする際に、 この値を大きくすることによってファイル操作のパフォーマンスを 向上させます。
ローカルタイムゾーンの設定をする。
DateTime関連の関数の実行速度が微妙に早くなるらしい。
mod_daflateが使えるといいのだが、さくらの共有サーバーでは使用できないので、phpのzlib拡張もジュールの設定をしてサーバーから送るコンテンツの内容をgzipで圧縮して送信するように設定を変更する。
mod_deflateでも同じことが言えるのだが、圧縮レベルは1だろうが9だろうがCPUパワーを使用する割にデータサイズにあまり差はないので1を設定する。
zlib.output_compression = On
zlib.output_compression = 1
[php.iniの設定内容]
vi $HOME/www/php.ini
;Load APC Module
extension="/$HOME/php-modules/apc.so"
;Config For APC
apc.enabled = 1
apc.shm_size = 64M
apc.ttl = 7200
apc.user_ttl = 7200
apc.enable_cli = 1
;Config For PHP
realpath_cache_size = 64k
date.timezone = "Asia/Tokyo"
zlib.output_compression = On
zlib.output_compression = 1
APCが正常に組み込まれているかをphpinfo()関数を書いたファイルを公開ディレクトリにおいて確認する。プログラムの出力に下記の内容が表示されていれば組み込みに成功!
組み込み成功!ちょっとだけ表示が早くなったような気がします。
しかし、実際のところさくらのレンタルサーバーで使用しているのは、CGI版のPHPなのでリクエストごとにキャッシュがクリアされるという話なので実質キャッシュが聞いていないと説があるので・・・早くなったような気がするのは気のせいなのかも・・・
ビジネスプロプランだとモジュール版PHPを使えるのでちゃんとAPCが効くようになります。
ただ、同じサーバ上でAPCを使っているユーザーがいると、デフォルトの設定ではキャッシュにヒットしなくなります。
php.iniに apc.mmap_file_mask=”/tmp/apc.XXXXXX” を追加すると動作するようになりました。