PHPの動作を高速化させる技術としてはAPCが知られています。スクリプトのコンパイル結果をキャッシュする事で構文解析をスキップすることができ、また任意のデータをキャッシュする事も出来る拡張モジュールです。今回はこのAPCをWindows Azure環境で導入を試みました。

拡張モジュールの入手

理由は不明ですが、APCの拡張モジュールはWindows版PHPにバンドルされていません。AzureのPHPはWindows版のPHPですから、やはり標準では含まれていません。とはいえWindows上でPHPの拡張をビルドするというのはなかなかチャレンジングです。いろいろと調べてみたところ下記のページでWindows用のAPCのバイナリが配布されていました。

http://downloads.php.net/pierre/

Azureに添付されているPHPに適合するのはVC9でビルドされたNon Thread Safeなバイナリですので該当するものをダウンロードして php/ext 以下にコピーし、php.iniからモジュールを読み込みます。

動作確認

さてphp.iniに設定を書きこんだのでphpinfo()にて読み込まれていることを確認してみます。

動作しているようです。がしかし、何度かリロードを繰り返すと、、、

クラッシュしてしまいました。このレベルでクラッシュしてしまうと前述した方法ではログが取れません。気になるのがAzureのローカルファイルに書き込めないという制限に対してAPCのWindows版についている注釈。

注意: Windows 版の APC では、temp パスが存在し、 Web サーバから書き込み可能になっていることが必要です。 APC は環境変数 TMP、TEMP、USERPROFILE の内容をこの順に調べ、 どれも設定されていない場合は WINDOWS ディレクトリを使用します。

該当の環境変数が指しているディレクトリを見てみると下記のような状態。

いくつかファイルは出来ていますがサイズが0です。どうにかしてこの状況を打開したい所ですがログが見れないという問題がある為、そこから考え直す必要がありそうです。現在の予想としてはファイルシステムがらみ(ロックとか)の問題が起きているかAPCとPHPの相性、スレッドセーフなどを疑っていますが果たして。。