2014年10月12日日曜日

PHPのキャッシュを行うAPC

キャッシュシステムを搭載している最新バージョンのPHPは不要ですが、そうでない古いPHPを使っている場合はAPCが非常に有効です。めちゃくちゃ速くなりますよ。

仕組としては
・通常
PHPファイルを読み込み、コンパイルして、実行。

・APCを入れると
ファイル読み込みとコンパイルを行いメモリに保存。コンパイル済みのメモリ上のキャッシュを使いまわす。
PHPファイルが更新されると再コンパイルが実行されます。(デフォルト設定)

ファイル読み込みとコンパイルが省略できるので非常に快適になります。

■注意点
コンパイル済みをキャッシュするという仕組上、注意点がございます。

1.動的に拡張ライブラリを読み込めない
PHPソース内から拡張ライブラリを読み込んでいる場合、これは失敗します。
php.iniで静的に読み込ませましょう。

2.ソースの中身を動的にいじれない
動的にメソッドの内容を変更したりはできないということです。
すなわち runkit 系は使えないということです。  変更はコンパイルが必要ですからね。

3.実行本体は破棄されずキャッシュとして残るので、PHPの終了処理が微妙に違う。
終了時(インスタンス開放時)に自動的に処理されるはずの処理が処理されなくなる物があります。
たとえばセッションを独自実装している場合、明示的にセッションの保存を呼び出さなければなりません。
セッションはインスタンス解放後に自動保存されるようになっていますが、この解放後の処理がされなくなるため、セッションの保存が自動実行できなくなります。
ということで、デストラクタでセッションを保存してあげましょう。

4.include_onceの動作も変ります
デフォルト設定では、処理の高速化のためinclude_onceの処理がAPC独自処理に置き換わります。
そのために制限が色々とでてきます、
動的にパスを指定できないや、相対パスが駄目だったりなど。
PHP5.3以降は高速にinclude_onceが実行されるのでAPC側の機能を使う意味がほとんどありません。
なので OFF にしてあげましょう。

apc.ini に
apc.include_once_override=0
を追加してあげてください。

include_onceが高速化されているといっても、遅いのに変りはありません。
大量にinclude_onceをしている場合は切り分けてなるべく include で済むようにすると体感できるほど速くなります。
と言っても時代はオートローダーですか。