Docker Desktop for Mac の環境で動かしていたPHPアプリケーションが遅い(1リクエスト1.2〜1.4秒ほどかかっていた)。 ずっと、Docker Desktop for Macの Mount 機能は速度が出ないからだ、と思いこんでいて、最近知った Mutagenを試したけど、200ミリ秒ほどしか改善しなかった。そこでもしかしたら遅い原因は他にあるんじゃないかと思い、調査したところ、以下の2つを変更したらかなりレスポンスタイムが短くなった(300〜450ミリ秒になった)
- Xdebugを無効にする(xdebug.so を読み込まない)
- OPcache を有効にする
Xdebug については、リモートデバッグやプロファイラなど遅くなりそうなオプションを全部Offにしても300ミリ秒くらいは増えるので、拡張自体が重いのかも、と思っている。
開発環境でOpcacheは無効化されていたけど、開発環境向けにファイルを変更したら即時反映するよう設定出来るんじゃないかと思ってやってみたら、できそうだったので記事としてまとめる。
開発環境向けOpcache 設定
PHPスクリプトへの変更が即時反映されるための設定は以下の通り。
; Opcache を有効にする opcache.enable=1 ; PHPスクリプトのタイムスタンプをチェックして、更新されていたらオペコードキャッシュを作り直す opcache.validate_timestamps=1 ; タイムスタンプの再チェックを行う時間(秒)。0なら実行毎にタイムスタンプチェックする opcache.revalidate_freq=0
Laravel 7.2 Hello, world アプリで測ってみた
フレームワークを使ったPHPアプリケーションでどのくらい効果があるかみるために、以下のようなサンプルアプリケーションを作ってみた。
に composer create-project
してHello, world ページを作っただけのLaravelアプリケーションがあるので、
git clone git@github.com:tenkoma/opcache-config-for-dev-sample.git cd opcache-config-for-dev-sample cp .env.example .env docker-compose run composer composer install docker-compose up -d docker-compose exec php-fpm php artisan key:generate
して、http://localhost:8000/hello にアクセスしてテストできる。 初回のアクセスはキャッシュを作るので2回目以降のタイムが速くなる。 Hello, Worldのコードは以下の通り。
<?php // routes/web.php Route::get('hello', function () { return 'Hello World'; });
テスト結果は以下の通り(10回ほどリクエスト後に10回計測)
- 1) Volumeオプション:デフォルト(
consistent
),opcache.enable=0
: 平均 0.96s (min 0.84s, max 1.09s) - 2) Volumeオプション:
cached
,opcache.enable=0
: 平均 0.44s (min 0.38s, max 0.48s) - 3) Volumeオプション:
cached
,opcache.enable=1 他上記設定を有効
: 平均 0.03s (min 0.03s, max 0.04s)
(2) → (3) で 0.35s〜0.44s くらい速くなった。
おわり。