前書き
PHPのパフォーマンスを向上させるための重要なツールの一つにOPcacheがあります。
OPcacheは、コンパイル済みのPHPスクリプトのバイトコードをメモリにキャッシュすることで、スクリプトの再実行時にコンパイルを省略し、実行速度を向上させます。
この記事では、Dockerを使用してPHPのOPcacheを有効化する方法を紹介します。
「そもそもOPCacheって何なの?」という方はこちらの記事 をご一読ください。
ステップ 1: Dockerfileの作成
Dockerfile
を作成してPHP-FPMとOPcacheをセットアップします。
また、カスタムのphp.ini
設定を適用するためのファイルも準備します。
|
|
ステップ 2: OPcacheの設定ファイルを作成
custom-php.ini
には、OPcacheの設定を含めます。例えば下記のように設定します。
|
|
OPcacheの設定オプションの解説
custom-php.ini
で設定した各項目の詳細について解説します。
基本設定
-
opcache.enable
1
に設定するとOPcacheが有効になります。0
に設定すると無効になります。
-
opcache.memory_consumption
- OPcacheが使用するメモリの最大量をメガバイト単位で指定します。
-
opcache.interned_strings_buffer
- PHPが内部的に使用する文字列のためのメモリ領域のサイズをメガバイト単位で指定します。
パフォーマンス設定
-
opcache.max_accelerated_files
- キャッシュできるPHPファイルの最大数を指定します。
-
opcache.validate_timestamps
1
に設定すると、PHPファイルが変更されたかどうかをチェックします。(開発環境では基本的にこちらを使用します)0
に設定すると、変更チェックを行わず、パフォーマンスが向上します。(本番環境では基本的にこちらを使用します)
-
opcache.revalidate_freq
opcache.validate_timestamps=1
の場合、PHPファイルの変更をチェックする頻度を秒単位で指定します。opcache.revalidate_freq=60
の場合、60秒ごとに更新することになります。
高度な設定
- opcache.fast_shutdown
1
に設定すると、スクリプトの実行終了時のメモリ解放処理を最適化します。
これらの設定を適切に調整することで、アプリケーションのパフォーマンスを最適化し、エンドユーザーにより良い体験を提供することが可能になります。
ステップ 3: Nginxの設定
Nginxの設定ファイルdefault.conf
を作成し、PHPのリクエストをPHP-FPMに転送するように設定します。
|
|
ステップ 4: Docker Composeの設定
docker-compose.yml
ファイルを作成して、NginxとPHP-FPMのコンテナを連携させます。
|
|
この設定では、htmlディレクトリ内のファイルがNginxとPHP-FPMの両方で共有されます。
ステップ 5: デモ用PHPスクリプトの準備
このスクリプトは、opcache_get_status()関数を使用してOPcacheの現在の設定と状態を取得し、それを整形して表示します。
OPcacheが有効であれば、キャッシュされているスクリプトの情報やキャッシュのヒット率など、詳細な情報を確認することができます。
check.php
スクリプトはhtml
ディレクトリに配置します。
|
|
ステップ 6: 環境のビルドと起動
ここまでのステップでファイル構成は下記のようになっています。
|
|
以下のコマンドを実行して、環境をビルドし、起動します。
|
|
ステップ 7: テストの実行
ブラウザからhttp://localhost:8080/check.php
にアクセスします。
ブラウザに下記内容が表示されれば問題なく動作しています。
|
|
ステップ 8: custom-php.iniを変更してみよう
opcacheが有効になっていることが確認できたので、今度はcustom-php.ini
を変更してopcache
を無効にしてみましょう。
下記のようにopcache.enable
を0に設定するだけです。
|
|
custom-php.ini
を変更したら下記コマンドで再実行して変更を反映させます。
|
|
下記だとダウンタイムなしで、設定ファイルを読み込むことができます。
|
|
上記コマンドについて簡単に解説すると、kill
コマンドはプロセスを終了させるだけでなく、シグナルを送ることによって様々な動作を実行させることができます。
USR2はユーザー定義シグナルと呼ばれるもので、アプリケーションによって動作が異なります。
php-fpm
ではgraceful reload of all workers + reload of fpm conf/binary
という動作になり、
日本語訳では「全てのワーカープロセスを優雅に再起動(現在のリクエストが完了するまで待つ)し、FPM設定ファイルやバイナリを再読み込みする。」となります。
本番環境で動作している際に上記シグナルを送ることによってダウンタイム無しで設定ファイルの再読み込みができます。
ちなみにdocker kill
はコンテナに対してkill
コマンドを実行しており、実際にコンテナに入って実行する際は下記のコマンドになります。
|
|
こちらでも同様に設定ファイルの再読み込みが可能です。
反映完了後、ブラウザでhttp://localhost:8080/check.php に再度アクセスすると下記の出力になります。
|
|
ちゃんと設定が反映されていますね。
これで設定ファイルを変更し、すぐに動作を確認できる状態になりました。ぜひ、さまざまな変更を試して動作を確認してみてください。
opcache-guiをインストールする
ここまででopcacheの有効化に関して解説は終わりですが、opcacheを使っていると、今どのくらいのメモリを使用しているのか確認したい時があります。
そういった場合にopcache-gui
をインストールしておくととても便利です。
opcache-gui
は、PHPのOPcacheの状態を視覚的に確認できるウェブインターフェースです。
opcache-gui
を使用すると、キャッシュの状態やパフォーマンス、設定などを簡単に確認できます。
opcache-guiの主な機能
キャッシュされたスクリプトの一覧表示
どのPHPファイルがOPcacheによってキャッシュされているかを確認できます。
キャッシュの使用状況
使用中のメモリ量、キャッシュされたスクリプトの数、キャッシュヒット率(キャッシュが効いている度合い)など、キャッシュの効率を示す指標を確認できます。
キャッシュの設定値
OPcacheの設定値を確認できます。
これには、メモリ消費量の上限やキャッシュするスクリプトの最大数などが含まれます。
キャッシュのクリア
ウェブインターフェースから直接、キャッシュをクリアすることができます。
これは、キャッシュされたデータをリセットしたい場合に便利です。
opcache-guiの利用方法
GitHub
からindex.php
ファイルをダウンロードし、ウェブサーバーにアップロードします。その後、ブラウザからそのファイルにアクセスすることで、opcache-gui
を使用できます。
具体的には先ほど作成したhtml
フォルダにダウンロードしたindex.php
を配置するだけで完了です。
|
|
ブラウザからhttp://localhost:8080/index.php
にアクセスすると下記画面が表示されます。
もしThe Zend OPcache extension is installed but not active
と表示されたらopcache.enable=0
となっているはずなのでopcache.enable=1
に設定後、設定ファイルを再読み込みしてからもう一度試してください。
まとめ
この記事では、Dockerを活用してPHPのOPcache
を設定し、その効果を検証する方法をステップバイステップで解説しました。
OPcache
はPHPスクリプトの実行速度を大幅に向上させることができる強力なツールであり、コンパイル済みのバイトコードをメモリにキャッシュすることで、スクリプトの再実行時のコンパイル時間を削減します。
このプロセスを通じて、アプリケーションのパフォーマンスを最適化し、エンドユーザーによりスムーズな体験を提供することが可能になります。