PHPのキャッシュ(OPcacheとpreload)についてメモ

はじめに

この記事は自分がPHPのキャッシュ戦略についての理解を整理するために書いています。 細かい解釈ミスなどありましたら教えていただけると幸いです。

まずは基本的なことですがおさらいから。
PHPインタプリタ言語です。インタプリタは事前コンパイルはされず、実行時にソースコードを読み込んで実行可能なバイトコードに変換します。
なので、事前に全て実行可能な機械語になっているコンパイル言語よりも遅いとよく言われます。
しかし、PHPにはOPCasheやpreloadの仕組みがあり、これらを活用すれば毎回毎回実行時にコンパイルされるわけではありません。

OPcasheについて

OPcasheについて公式の説明を引用します。
PHP: OPcache - Manual

OPcache はコンパイル済みのバイトコードを共有メモリに保存し、PHP がリクエストのたびにスクリプトを読み込み、パースする手間を省くことでパフォーマンスを向上させます。

OPcasheを使うとコンパイル済みのバイトコードが保存されて実行されるので、毎度コンパイルする必要がありません。
OPcasheはPHP5.5から入っているので、今世界で動いているPHPの多くはこの仕組みを使っていると思います。

OPcasheはphp.iniで設定されています。詳しい設定内容は公式に記載されています。

PHP: 実行時設定 - Manual

preloadについて

preloadはPHP7.4で実装された機能で、サーバー起動時に事前にコンパイルした結果をキャッシュしてPHPを高速化する機能です。
OPcacheは実行された結果をキャッシュしますが、preloadは実際に実行される前に事前にコンパイルした結果をキャッシュするので、最初から高速化されています。
PHP: コードの事前ロード - Manual

キャッシュの破棄タイミングについてメモ

細かいキャッシュ破棄のケースについては割愛しますが、新しいコードがデプロイされてサーバーが再起動されたタイミングでは基本的にキャッシュが破棄されます。
古いキャッシュは破棄されますが、preloadの機能で事前コンパイルした結果がキャッシュに保存されるので、最初からキャッシュありで実行することができます。