0Pricing
PHP Academy · レッスン

OPcache:バイトコードキャッシュ

OPcacheを有効化・調整して、スクリプトの再コンパイルによるオーバーヘッドをなくします

「OPcache:バイトコードキャッシュ」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。

PHPの通常の動作

OPcacheがない場合、リクエストのたびにPHPは次の処理を行います。ディスクから.phpファイルを読み取り、ASTに解析し、オペコード(バイトコード)にコンパイルしてから、オペコードを実行します。

OPcacheの役割

OPcacheは、コンパイル済みのオペコードを共有メモリに保存します。以降のリクエストでは、PHPは解析とコンパイルの手順を省略し、直接実行に進みます。

性能への影響

OPcacheを使用すると、通常、コードを変更せずにPHPアプリケーションのスループットを2~5倍向上できます。

OPcacheの有効化

OPcacheはPHP 5.5以降に含まれており、多くのディストリビューションではデフォルトで有効になっています。php -m | grep -i opcacheで確認できます。

# php.ini:
[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=0

主なOPcache設定

本番環境では、次の設定を調整します。

# php.ini:
opcache.memory_consumption=256      ; MB of shared memory
opcache.interned_strings_buffer=16  ; MB for interned strings
opcache.max_accelerated_files=20000 ; max scripts to cache
opcache.validate_timestamps=0       ; disable for production!
opcache.revalidate_freq=0           ; how often to check timestamps

validate_timestamps=0

本番環境では、validate_timestamps=0を設定してリクエストごとのファイルシステムチェックを無効にします。PHPは常にキャッシュ済みのオペコードを使用します。デプロイ後はキャッシュをリセットしてください。

OPcacheのリセット

新しいコードをデプロイした後は、キャッシュを消去します。

<?php
opcache_reset(); // from a PHP script
// Or restart PHP-FPM:
$ kill -USR2 $(cat /run/php-fpm.pid)

opcache_get_status()

実行時にOPcacheの統計情報を取得して、ヒット率とメモリ使用量を監視します。

<?php
$status = opcache_get_status();
echo "Hit rate: ".$status["opcache_statistics"]["opcache_hit_rate"]."%";

プリロード(PHP 7.4以降)

OPcacheのプリロードは、サーバー起動時にフレームワークのファイルを共有メモリへ読み込みます。これにより、コアクラスであっても初回リクエスト時のコンパイルオーバーヘッドをなくせます。

# php.ini:
opcache.preload=/srv/app/preload.php
opcache.preload_user=www-data

JITコンパイル(PHP 8.0以降)

PHP 8では、OPcache上でJIT(Just-In-Time)コンパイルが導入され、オペコードがネイティブマシンコードに変換されます。CPU負荷の高い処理では大きな効果がありますが、一般的なI/OバウンドのWebアプリケーションでは効果は限定的です。

# php.ini:
opcache.jit_buffer_size=100M
opcache.jit=1255

イミュータブルクラス

OPcacheは、インターン化された文字列とイミュータブルなクラス定義をワーカープロセス間で共有できます。これにより、プロセスごとのメモリ消費量を削減できます。

まとめ

本番環境ではvalidate_timestamps=0を設定してOPcacheを有効にします。デプロイ後はopcache_reset()またはPHP-FPMの再起動でキャッシュを消去します。opcache_get_status()でヒット率を監視します。

理解度チェック

OPcacheの性能を最大限に高めるため、本番環境で0に設定すべきphp.iniの設定は何ですか。

よくある質問

「OPcache:バイトコードキャッシュ」レッスンは無料ですか?

はい。「OPcache:バイトコードキャッシュ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。

「OPcache:バイトコードキャッシュ」で何を学びますか?

OPcacheを有効化・調整して、スクリプトの再コンパイルによるオーバーヘッドをなくします ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

PHP Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「OPcache:バイトコードキャッシュ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPHP Academyレッスンでコードを書いて実行できますか?

はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. XdebugでPHPをプロファイリングする
  2. OPcache:バイトコードキャッシュ
  3. データベースクエリの最適化
  4. メモリ管理とパフォーマンスのヒント
← PHP Academyに戻る