読者です 読者をやめる 読者になる 読者になる

waste of time

主にPHP

PHPのキャッシュ機構のおさらいと、opcacheの設定とかキャッシュクリアとか

PHP OPcache

PHPのキャッシュ機構

  • APC
    • PHP: APC - Manual
    • オペコードキャッシュ機能+データキャッシュ(ユーザキャッシュ)機能をもつ。現在は開発が停止されており、PHP5.5.0以降は以下2つのキャッシュ機構の使用が推奨されている。
  • APCu
    • PHP: APCu - Manual
    • APCからオペコードキャッシュ機能を取り除いて、データキャッシュ機能のみを提供する。デフォルトでバンドルされていない。
  • Zend OPcache
    • PHP: OPcache - Manual
    • オペコードキャッシュ機能を提供する。PHP5.5.0以降はデフォルトでバンドルされている。

APCが廃止されたのは、重大なバグがあったためらしい。

opcacheの推奨設定

PHP: インストール手順 - Manual

opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

opcacheは、opcache.revalidate_freqで設定した秒数(デフォルト2秒)おきにファイルの変更をタイムスタンプで確認し、変更があればキャッシュを再生成します。 上記の推奨設定例だと、自動デプロイされたファイルがキャッシュに反映されるまで最大60秒かかってしまうため、CIツールなどで自動デプロイされたタイミングでopcache_reset()またはopcache_invalidate()関数を使ってキャッシュをクリアすると良さそうです。

opcache_reset()の罠

opcache_reset()を呼び出すと、全てのオペコードキャッシュがリセットされ、次回ヒット時は再びソースを読み込んでパースします。 ただし、opcache_reset()の呼び出し方によって以下のような違いがあるため注意が必要です。

  • CLIPHPで呼び出す
    • CLIPHPで生成されたキャッシュのみリセットされる。
  • モジュール版PHPで呼び出す
    • 全てのキャッシュがリセットされる。

例えば、Jenkinsでデプロイシェルを実行したあとにphp -r 'opcache_reset();'しても、webのオペコードキャッシュはリセットされないため、web経由でopcache_resetを実行させる仕組みを用意する必要があります。

参考