こんにちは。よっしーです(^^)
今日は、slimのローカル開発環境にxdebugを導入した方法についてご紹介します。
前提
この記事は下記の記事をベースにしています。
背景
slimのローカル開発環境にxdebugを導入して、プロファイリングをしたときの修正内容を共有します。Codeigniterのローカル環境では、プロファイリングにtideways_xhprofを利用していました。その時の記事は下記を御覧ください。
今回もtideways_xhprofを導入しようとしましたが、インストール時にエラーになったために導入を見送りました(PHP8では、tideways_xhprofをインストールできない?)。
調べた結果、xdebugのプロファイル機能を利用してプロファイリングのデータを取得し、Webgrindを利用して可視化する方法を見つけましたので、そちらを採用しました。
修正内容
下記のファイルを修正、もしくは、新規作成します。下記の各セクションで修正内容を記載しています。
new file: app/php-fpm/xdebug.ini
modified: Makefile
modified: app/compose.yml
modified: app/php-fpm/.gitignore
modified: app/php-fpm/Dockerfile
app/php-fpm/xdebug.ini
下記の内容で新規作成します。
zend_extension=xdebug
# for XDebug3
[xdebug]
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.mode=debug,coverage,profile
xdebug.output_dir=/tmp/xdebug
xdebug.idekey = VSCODE
xdebug.start_with_request=yes
app/php-fpm/xdebug.ini
41行目に追記します。
+# コンテナの削除
+.PHONY: clean
+clean:
+ cd $(WOKR_DIR) \
+ && docker-compose down --rmi all --volumes --remove-orphans
Makefile
48行目を修正します。xdebugのインストール自体には影響がありませんが、他がスネークケースで記載していたので、修正しました。
-.PHONY: loginMariadb
-loginMariadb:
+.PHONY: login_mariadb
+login_mariadb:
app/compose.yml
37行目に追記します。
+ - ./php-fpm/xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
+ - ./php-fpm/xdebug:/tmp/xdebug
88行目に追加します。
+ webgrind:
+ image: jokkedk/webgrind:latest
+ container_name: webgrind
+ volumes:
+ - ./php-fpm/slim_app:/host/var/www/slim_app
+ - ./php-fpm/xdebug:/tmp
+ ports:
+ - 8082:80
+ networks:
+ - net
app/php-fpm/.gitignore
3行目に追記します。
+xdebug
app/php-fpm/Dockerfile
11行目に追記します。
+RUN pecl install xdebug \
+ && docker-php-ext-enable xdebug
動作確認
下記のコマンドを実行します。
make build
make up
curl -Lk http://localhost
ブラウザで「http://localhost:8082/」にアクセスして、下記の画面になれば成功です。
「update」をクリックすると下図のような画面になります。
「Show Call Graph」をクリックします。
下図のようなグラフが表示されていれば成功です。
解説
app/php-fpm/xdebug.ini
このコードは、XDebug拡張機能の設定を行っています。XDebugはPHPのデバッグやプロファイリングのためのツールであり、IDEと連携して使用することができます。
zend_extension=xdebug
は、XDebug拡張機能を有効にするための設定です。これにより、PHPの実行時にXDebugが読み込まれます。
[xdebug]
セクション以下の設定は、XDebugの動作をカスタマイズするためのものです。
xdebug.client_host=host.docker.internal
は、XDebugクライアントが実行されるホストのアドレスを指定しています。この設定は、Docker内のPHPコンテナからホストマシンのXDebugクライアントに接続する場合に使用されます。xdebug.client_port=9003
は、XDebugクライアントとの通信に使用されるポート番号を指定しています。通常、デフォルトのポート番号9000が使用されますが、この例では9003に設定されています。xdebug.mode=debug,coverage,profile
は、XDebugのモードを指定しています。デバッグ、カバレッジ解析、プロファイリングのすべてのモードが有効になっています。xdebug.output_dir=/tmp/xdebug
は、XDebugが生成する一時ファイルの保存先ディレクトリを指定しています。デバッグ情報やプロファイリング結果などがここに保存されます。xdebug.idekey=VSCODE
は、IDEキーを指定しています。IDEキーは、XDebugがどのIDEと通信するかを識別するために使用されます。この例では、Visual Studio Codeを表す”VSCODE”が指定されています。xdebug.start_with_request=yes
は、XDebugがすべてのリクエストで自動的に起動するようにする設定です。つまり、PHPのスクリプトが実行されるたびにXDebugが有効になります。
これらの設定を使用することで、XDebugを使ってPHPのデバッグやプロファイリングを行う準備が整います。また、IDEとの連携により、より効果的なデバッグ作業が可能になります。
app/compose.yml
このコードは、Docker Composeファイル内でWebgrindというツールのコンテナを設定しています。Webgrindは、XDebugによって生成されたプロファイリングデータを可視化するためのWebベースのツールです。
以下は、各設定の解説です:
webgrind:
: サービスの名前を指定しています。image: jokkedk/webgrind:latest
: Webgrindコンテナのイメージを指定しています。この例では、jokkedk/webgrind
の最新のバージョンを使用しています。container_name: webgrind
: コンテナの名前を指定しています。この例では、”webgrind”という名前を使用しています。volumes:
: コンテナとホストマシンのディレクトリをマウントするための設定です。./php-fpm/slim_app:/host/var/www/slim_app
: ホストマシンの./php-fpm/slim_app
ディレクトリをコンテナ内の/host/var/www/slim_app
ディレクトリにマウントします。つまり、ホストマシンのディレクトリ内のファイルがコンテナ内の該当するディレクトリに表示されます。./php-fpm/xdebug:/tmp
: ホストマシンの./php-fpm/xdebug
ディレクトリをコンテナ内の/tmp
ディレクトリにマウントします。これにより、XDebugが生成するプロファイリングデータがコンテナ内の/tmp
ディレクトリに保存されます。
ports:
: コンテナのポートとホストマシンのポートのマッピングを行うための設定です。8082:80
: ホストマシンの8082番ポートをコンテナの80番ポートにマッピングします。つまり、Webgrindにはhttp://localhost:8082
でアクセスできるようになります。
networks:
: コンテナが所属するネットワークを指定します。net
:net
という名前のネットワークにコンテナを追加します。他のコンテナとのネットワーク接続を可能にします。
これらの設定を使用することで、Webgrindコンテナが起動し、XDebugが生成するプロファイリングデータをWebインターフェースで閲覧できるようになります。また、ホストマシンのディレクトリとのマウントにより、コンテナ内のファイルをホストマシンからアクセスできるようになります。ポートのマッピングにより、Webgrindにはホストマシンからアクセスできるようになります。
xdebugとxhprof
XDebugを利用してプロファイリングを取得する理由は以下の通りです:
- 統合された開発環境(IDE)のサポート: XDebugは、多くの統合開発環境(IDE)とのシームレスな連携を提供しています。IDE上でブレークポイントを設定し、ステップ実行や変数の監視などの高度なデバッグ機能を利用することができます。XDebugのプロファイリングデータをIDE上で直接解析できるため、開発者はより簡単に問題の特定と解決ができます。
- 詳細な情報の提供: XDebugは、関数の呼び出し回数、実行時間、メモリ使用量などの詳細な情報を提供します。これにより、アプリケーションのボトルネックやパフォーマンスの問題を特定するのに役立ちます。
- 柔軟なトリガー: XDebugでは、プロファイリングをトリガーするための様々な方法が用意されています。例えば、全てのリクエストで自動的にプロファイリングを開始する設定や、特定のGETパラメータやクッキーを指定してプロファイリングを開始する設定などがあります。これにより、必要なタイミングや条件でプロファイリングを実行することができます。
xhprofは別のプロファイリングツールであり、XDebugとは異なるアプローチを取っています。xhprofも有用なツールですが、XDebugと比較していくつかの違いがあります。
- xhprofはPHP拡張モジュールとして提供されており、XDebugのようにIDEとの統合はありません。xhprofの結果を解析するためには、独自のインターフェースやツールを使用する必要があります。
- XDebugはPHPのデバッグに特化しており、プロファイリングだけでなく、ステップ実行や変数の監視などのデバッグ機能も提供します。一方、xhprofは主にプロファイリングに特化しています。
- XDebugは広く使用されており、多くの統合開発環境(IDE)との連携がサポートされています。一方、xhprofは比較的マニュアルな手法が必要で、IDEとの統合や高度なデバッグ機能は提供されていません。
したがって、XDebugは主にPHPのデバッグとプロファイリングの両方をサポートするための包括的なツールとして使用され、統合開発環境(IDE)との連携が求められる場合に特に有用です。一方、xhprofはプロファイリングに特化した独自のツールとして使用されることがあります。どちらのツールを使用するかは、開発者のニーズと環境に応じて選択する必要があります。
おわりに
今日は、slimのローカル開発環境にxdebugを導入した方法についてご紹介しました。
xdebugでプロファイリングすると、デバッグもできるので便利だなと思いました。
本記事でご紹介したソースは、下記のリポジトリにあります。
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント