PHP 7 になってから、Webサーバー(PHP-FPM や mod_php などの SAPI)においては OPCache がデフォルトで有効な状態で動作する構成が一般的になりました。
パフォーマンスに大きな影響を与える重要な仕組みであるにもかかわらず、「とりあえず有効になっているもの」として深く理解しないまま運用されているケースも少なくありません。
ここでは、OPCache の役割やメリット・デメリットについて整理しておきます。
OPCache とは?
OPCache(正式には Zend OPcache)は、PHP のスクリプトをコンパイルした「オペコード(中間コード)」をメモリ上にキャッシュしておく仕組みです。
通常、PHP の処理は以下の流れで実行されます。
- PHP ファイルを読み込む
- ソースコードをパース(構文解析)する
- オペコードへコンパイルする
- オペコードを実行する
しかし、Web アプリケーションでは同じ PHP ファイルがリクエストごとに何度も実行されます。
OPCache が無効な場合、上記の「パース」や「コンパイル」は毎回繰り返されます。
OPCache を有効にすると、コンパイル済みのオペコードを共有メモリ上に保持し、次回以降のリクエストでは再コンパイルを行わずにそのまま実行することができます。
つまり、
「PHP をスクリプト言語ではなく、事前コンパイルされた言語のように振る舞わせる仕組み」
と言えます。
OPCache のメリット
1. アプリケーションのレスポンス向上
ソースコードのパースおよびコンパイル処理は CPU コストの高い処理です。
OPCache を利用することで、これらの処理をスキップできるため、リクエストごとの処理時間が短縮されます。
特に Laravel などのフレームワークでは、1 リクエストあたりに読み込まれる PHP ファイル数が非常に多いため、OPCache の効果は顕著に現れます。
2. CPU 使用率の低減
再コンパイルが不要になることで、CPU 使用率が大きく低下します。
トラフィックの多い環境では、同一インスタンスで処理できるリクエスト数が増加し、結果としてスケールアウトの頻度を抑えることにもつながります。
3. スループットの向上
OPCache によって処理時間が短縮されると、同時リクエストに対する処理能力(スループット)が向上します。
これは PHP-FPM を用いたアプリケーションサーバー構成において、ワーカープロセスの有効活用に直結します。
4. フレームワーク最適化機能との相性
Laravel の以下のような最適化コマンドは、生成された PHP コードが OPCache にキャッシュされることを前提として効果を発揮します。
- config:cache
- route:cache
- view:cache
OPCache が有効な環境では、これらの最適化によってさらなるパフォーマンス改善が期待できます。
OPCache のデメリット
1. メモリ使用量の増加
オペコードは共有メモリ上に保存されるため、OPCache を有効にすると一定量のメモリを消費します。
設定値(opcache.memory_consumption など)が不足している場合、キャッシュの破棄や再生成が頻発し、かえってパフォーマンス低下を招く可能性があります。
2. デプロイ時のキャッシュ不整合
OPCache はコンパイル済みコードをメモリ上に保持するため、PHP ファイルを更新しても即座に反映されない場合があります。
特に以下のような設定の場合は注意が必要です。
- opcache.validate_timestamps=0
この設定は本番環境でのパフォーマンス向上に有効ですが、デプロイ後に PHP-FPM の再起動やキャッシュのリセットを行わないと、古いコードが実行され続ける可能性があります。
3. 開発環境での挙動の違い
開発環境で OPCache を有効にしている場合、コード変更が即時反映されず、意図しない動作の原因となることがあります。
開発環境では validate_timestamps を有効にする、あるいは OPCache 自体を無効化するなど、用途に応じた設定の切り分けが必要です。
OPCache は PHP アプリケーションのパフォーマンスに大きな影響を与える重要な仕組みです。
デフォルトで有効になっているからといって設定を放置するのではなく、実行環境のメモリ量やデプロイ方法に応じて適切にチューニングすることが重要です。