Docker コンテナ内の PHP 8.0 を macOS 上の PhpStorm から Xdebug 3.3.2 を介してデバッグする
Docker コンテナ内の設定
まず、 Docker コンテナ内に PHP と Xdebug を導入しておく必要がある.
Xdebug は pecl コマンドが使えれば簡単にインストール可能. PHP をソースからビルドする場合、 configure 実行時に --with-pear フラグを付けておかないと
pecl コマンドがインストールされないため要注意.
# PHP 8.0.10 をソースからインストールする場合は Dockerfile の記述は以下のような感じ.
RUN wget https://github.com/php/php-src/archive/refs/tags/php-8.0.10.tar.gz \
&& tar xvzf php-8.0.10.tar.gz \
&& cd php-src-php-8.0.10 \
&& ./buildconf --force \
&& ./configure \
--enable-fpm \
--enable-gd \
--with-zip=/usr/lib64 \
--with-mysqli \
--with-pdo-mysql \
--with-curl \
--with-zlib \
--with-openssl \
--with-pear \
&& make \
&& make install \
&& cp php.ini-development /usr/local/lib/php.ini
RUN pecl install xdebug
インストール完了後、 php.ini ファイルに Xdebug を使用するための設定を記述しておく必要がある.
PHP をソースから入れた場合 /usr/local/lib/php.ini を読み込むようになっているようだが、これは環境によって異なる可能性がある.
コマンドラインから php を実行する場合には php --ini 、 Nginx/Apache から PHP を実行する場合には以下のような phpinfo() 関数を実行するだけの PHP ファイルを Nginx が fastcgi 経由で
実行できるようにし、ブラウザからアクセスして php.ini の場所を確認するとよい.
<?php
echo phpinfo();
php.ini の場所が確認できたら、そのファイルを編集して Xdebug モジュールを読み込むように設定する.
同時に、ホスト OS 上で動作している PhpStorm に Xdebug からデバッグ情報を渡せるようにホスト名やポート番号などを指定する.
IDE キー (xdebug.idekey) は良くわからないが、 PhpStorm 上で正しくデバッグできるようにするためには必要らしい…
これらの設定項目は Xdebug 2 と Xdebug 3 では大きく変更されているので注意が必要である (https://zenn.dev/k_tabuchi/books/5c03f59c00d4dc/viewer/53c98e).
なお zend_extension では Xdebug のライブラリのパスを指定するが、これは pecl install xdebug のインストール後にターミナルに出力されているはずである.
# php.ini
[xdebug]
zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20200930/xdebug.so"
xdebug.mode = debug,develop
xdebug.start_with_request = yes
xdebug.client_port = 9003
xdebug.client_host = host.docker.internal
xdebug.idekey = phpstorm
PHP から Xdebug が正しく認識されていると、 php -m や php --version を実行した際に以下のように Xdebug の表示も増えるはずである.
$ php -m
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
gd
hash
iconv
json
libxml
mysqli
mysqlnd
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
Reflection
session
SimpleXML
SPL
sqlite3
standard
tokenizer
xdebug
xml
xmlreader
xmlwriter
zip
zlib
[Zend Modules]
Xdebug
$ php --version
PHP 8.0.10 (cli) (built: Aug 2 2024 06:20:57) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.10, Copyright (c) Zend Technologies
with Xdebug v3.3.2, Copyright (c) 2002-2024, by Derick Rethans
PhpStorm 側の設定
PhpStorm 側ではプロジェクトのフォルダを開いた後、 PhpStorm → 設定 から設定ウィンドウを開いて以下の設定を行う.
-
左側のペイン上で
ビルド、実行、デプロイのサブメニュー内にあるDockerをクリックし、以下のように設定を行う.-
+ボタンをクリックして設定を追加し、名前をDocker、Docker デーモンへの接続方法をDocker for Macに設定する. -
Docker for Macの項目はdefault unix:///var/run/docker.sockで OK.
-
-
左側のペイン上で
PHPをクリックし、以下のように設定を行う.-
PHP 言語レベル (P)を目的の PHP のバージョンに設定. -
CLI インタープリターには Docker コンテナ内の PHP インタプリタの設定を行う.-
…をクリックしてCLI インタープリターウィンドウを開き、+ボタンをクリックして設定を追加. -
サーバーをDockerに設定し、イメージ名に目的の Docker コンテナのイメージを指定する. -
PHP 実行可能ファイルはphpコマンドのパスを指定するようだが、とりあえず単にphpとしておけばよい. -
構成ファイルにはコンテナ内のphp.iniファイルの場所 (/usr/local/lib/php.iniなど) を指定する. -
入力後、
PHP 実行可能ファイルの入力欄の右側にあるphpinfo の再ロードボタンをクリックしてデバッガーとして Xdebug が適切に認識されれば OK. -
ウィンドウ右下の
OKボタンをクリック.
-
-
パスマッピングにはホスト OS 側のプロジェクトフォルダとコンテナ側のフォルダの対応関係を設定する.-
(つまり、コンテナに対してはボリュームマウントでホスト OS 内のプロジェクトフォルダをコンテナ内にマウントしていることを前提としている.)
-
右端のアイコンをクリックして
プロジェクトパスマッピングの編集ウィンドウを表示し、+アイコンをクリックしてローカルパス(ホスト OS 側) とリモートパス(コンテナ側) のフォルダパスの対応関係を記述してOKをクリックする.
-
-
Docker コンテナーにはコンテナに対するボリュームマウントの設定を書くようだ.-
既にコンテナが動作している場合にこの設定が必要になるのかは不明…
-
とりあえず、右端のアイコンをクリックして
Docker コンテナー設定の編集ウィンドウを表示し、ボリュームバインディング内の+ボタンをクリックしてホストパスとコンテナーパスを設定しておく.読み取り専用にはチェックは入れないでおく. -
右下の
OKボタンをクリックしてウィンドウを閉じる.
-
-
-
左側のペイン上で
PHPのサブメニュー内にあるサーバーをクリックし、以下のように設定を行う.-
+ボタンで設定を追加し、名前をlocalhost、ポートを80、デバッガーをXdebugに設定.-
コンテナ内での Nginx のポートを指定するようだ.
-
-
パスマッピングを使用するにチェックを入れ、ファイル/ディレクトリ内のプロジェクトファイルに対応するサーバー上の絶対パスにコンテナ内のパスを入力しておく.
-
-
左側のペイン上で
PHPのサブメニュー内にあるデバッグをクリックし、以下のように設定を行う.-
Xdebug項目内のデバッグポートにポート番号9003が (必要に応じてカンマ区切りで) 入力されていることを確認する. その横の外部接続を受け入れるにチェックを入れておく.
-
-
一通り設定できたら、画面右下の
OKボタンをクリックしてウィンドウを閉じる.
デフォルトでは PhpUnit によるユニットテストのための実行構成しか登録されていない可能性があるため、リモートデバッグのための実行構成を設定しておく.
-
メニューから
実行 → 実行構成の編集…をクリックし、実行/デバッグ構成ウィンドウを表示する. -
左上の
+ボタンからPHP リモートデバッグを追加し、名前 (N)に適当に名前を設定しておく. -
IDE キーでデバッグ接続をフィルターするにチェックを入れ、サーバー (E)にlocalhost、IDE キー (セッション ID) (K)にphpstormと入力しておく. -
画面右下の
OKボタンをクリックしてウィンドウを閉じる.
これにより設定が完了したため、後はメインウィンドウ上部に表示されている虫のアイコン PHP デバッグ接続のリッスンを開始 ボタンをクリックし、
適当な行にブレークポイントを指定してからウェブブラウザからアクセスを行うと、 PhpStorm 上で指定したブレークポイントでプログラムの実行が停止するようになる.