🐈

Laravel・Xdebug・webgrindをDockerで動かす

2024/09/08に公開

サンプルコード

Laravel・Xdebug・webgrind をDockerで動かす最小構成

バージョン
Laravel 11.22
PHP 8.3
Xdebug 3.3
webgrind 1.9

https://github.com/HayatoKudou/xdebug-webgrind-sample

プロファイル出力方法

コンテナ起動

ルートディレクトリ直下で docker compose up -d を実行しコンテナを起動

docker compose up -d ログ
% docker compose up -d
WARN[0000] /Users/project/xdebug-webgrind-sample/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Building 3.4s (18/18) FINISHED                                                                                                                                                                                                   docker:orbstack
 => [webgrind internal] load build definition from Dockerfile                                                                                                                                                                                   0.0s
 => => transferring dockerfile: 161B                                                                                                                                                                                                            0.0s
 => [phpfpm internal] load build definition from Dockerfile                                                                                                                                                                                     0.1s
 => => transferring dockerfile: 349B                                                                                                                                                                                                            0.0s
 => [webgrind internal] load metadata for docker.io/jokkedk/webgrind:1.9.3                                                                                                                                                                      3.2s
 => [phpfpm internal] load metadata for docker.io/library/php:8.3-fpm                                                                                                                                                                           2.2s
 => [phpfpm internal] load .dockerignore                                                                                                                                                                                                        0.0s
 => => transferring context: 2B                                                                                                                                                                                                                 0.0s
 => [phpfpm 1/5] FROM docker.io/library/php:8.3-fpm@sha256:12824476a7ec5dbec790fcbcff7153a8535988fbcbeed850cfe7a9fbeecfaee6                                                                                                                     0.0s
 => [phpfpm internal] load build context                                                                                                                                                                                                        0.0s
 => => transferring context: 70B                                                                                                                                                                                                                0.0s
 => CACHED [phpfpm 2/5] RUN apt-get update                                                                                                                                                                                                      0.0s
 => CACHED [phpfpm 3/5] COPY php8.3.ini /usr/local/etc/php/php.ini                                                                                                                                                                              0.0s
 => CACHED [phpfpm 4/5] RUN pecl install xdebug-3.3.2                                                                                                                                                                                           0.0s
 => CACHED [phpfpm 5/5] RUN docker-php-ext-enable xdebug                                                                                                                                                                                        0.0s
 => [phpfpm] exporting to image                                                                                                                                                                                                                 0.0s
 => => exporting layers                                                                                                                                                                                                                         0.0s
 => => writing image sha256:4f8cafb20ad02d9997bf9374dec14748ffdbc52036b5178fd580f1fd8ced4ede                                                                                                                                                    0.0s
 => => naming to docker.io/library/xdebug-webgrind-sample-phpfpm                                                                                                                                                                                0.0s
 => [phpfpm] resolving provenance for metadata file                                                                                                                                                                                             0.0s
 => [webgrind internal] load .dockerignore                                                                                                                                                                                                      0.0s
 => => transferring context: 2B                                                                                                                                                                                                                 0.0s
 => [webgrind 1/2] FROM docker.io/jokkedk/webgrind:1.9.3@sha256:0594c485d78f5526d99b675751b911380da2ac06f8fb1c0dce1eddd9276f3693                                                                                                                0.0s
 => => resolve docker.io/jokkedk/webgrind:1.9.3@sha256:0594c485d78f5526d99b675751b911380da2ac06f8fb1c0dce1eddd9276f3693                                                                                                                         0.0s
 => CACHED [webgrind 2/2] RUN apt-get update && apt-get install -y python3 graphviz                                                                                                                                                             0.0s
 => [webgrind] exporting to image                                                                                                                                                                                                               0.0s
 => => exporting layers                                                                                                                                                                                                                         0.0s
 => => writing image sha256:860f158e4aca9f7e918a730586c910c0b7633adc7b3b9d822056b86984ff3c80                                                                                                                                                    0.0s
 => => naming to docker.io/library/xdebug-webgrind-sample-webgrind                                                                                                                                                                              0.0s
 => [webgrind] resolving provenance for metadata file                                                                                                                                                                                           0.0s
[+] Running 3/3
 ✔ Network xdebug-webgrind-sample_default       Created                                                                                                                                                                                         0.0s
 ✔ Container xdebug-webgrind-sample-webgrind-1  Started                                                                                                                                                                                         0.2s
 ✔ Container xdebug-webgrind-sample-phpfpm-1    Started                                                                                                                                                                                         0.2s

サンプルコードを実行しプロファイル出力

  • docker exec -it phpfpm bash を実行し、php-fpmコンテナに入る
  • コンテナ内で php artisan app:sample を実行し、サンプルコマンドの実行
root@ff10193c6cde:/var/www/html# php artisan app:sample
Result: 666666166.45884
  • xdebug-resultディレクトリにプロファイル結果(cachegrind.***)が出力される
    (マウントしているためローカルマシンからも確認ができる)

出力したプロファイル

webgrindでプロファイルの読み取り

  • http://localhost:8080 にアクセスし、webgrindを開く
  • xdebug-resultディレクトリ配下にプロファイルがある状態で画面右上のupdateボタンをクリック
  • プロファイルが読み取られ一覧が表示される
    (サンプルコマンド内で実行した App\Console\Commands\heavyComputation のプロファイル結果が表示されていればOK)

webgrindでプロファイルのグラフ化

  • Shaw Call Graphボタンをクリックすると新しいタブでプロファイルがグラフ化されて表示される

Discussion