こもろぐ @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

開発環境でOpcacheを有効にする

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 くらい速くなった。

おわり。