Laradockで動作するPHPアプリをリモートデバッグ

Tag:

Laradockでxdebugを設定して、PhpStormからリモートデバッグしてみます。

.envの設定変更

「laradock/.env」の設定を以下のようにします。

WORKSPACE_INSTALL_XDEBUG=true

PHP_FPM_INSTALL_XDEBUG=true

DOCKER_HOST_IP=192.168.11.10

「laradock/.env」は、「laradock/docker-compose.yml」にて利用されます。

DOCKER_HOST_IPは、Dockerコンテナから見えるローカルマシンのIPアドレスです。ホストマシン上でifconfigなどで確認して設定します。

phpの設定変更

「laradock/workspace/xdebug.ini」
「laradock/php-fpm/xdebug.ini」

上記ファイルの設定を以下のようにします。
(注意 後述しますが、下記設定だとうまくいかないです。)

- xdebug.remote_autostart=0
+ xdebug.remote_autostart=1
- xdebug.remote_enable=0
+ xdebug.remote_enable=1
- xdebug.remote_connect_back=0
+ xdebug.remote_connect_back=1
- xdebug.cli_color=0
+ xdebug.cli_color=1
  xdebug.profiler_enable=0
  xdebug.remote_handler=dbgp
  xdebug.remote_mode=req

  xdebug.remote_port=9000
  xdebug.remote_host=dockerhost
  xdebug.idekey=PHPSTORM

参考)
http://laradock.io/#edit-xdebug-ini-files

imageの作り直し

docker imageを作り直します。

docker-compose up --build -d php-fpm

「docker-compose.yml」の「depends_on」にて、「workspace」が指定されているため、「workspace」も作り直されました。

nginxとmysqlも立ちあげときます。

PhpStormの設定

ここでは、以下のように設定。

デバッグ接続をリッスン状態にします。(start Listening for PHP Debug Connections)

以下コマンドで、9000ポートでリッスン状態となっていることが確認できます。

これで、以下のようにリモートデバッグを行えるようにしたつもりです。

1. コンテナにリクエストが到達すると、

2. コンテナ上のXdebugが、ホストマシン(今回は192.168.11.10)の
   9000ポートに対してDBGPの接続通信を行う。

3. DBGPの接続が確立してデバッグが行える。

が、しかし、うまくいかない、、、
原因を調べてみます。

xdebug_logの確認

とりあえず、xdebug_logを出力するようにして、不具合の原因を確認します。

イメージを作り直すのが面倒なので、直接コンテナをいじります。

docker-compose exec php-fpm bash

と思ったら、viがない。

追加します。

apt-get update
apt-get install vim

追加後、下記内容を追記します。

xdebug.remote_log="/tmp/xdebug_log"

設定反映させるため、コンテナの停止・稼働を行います。

docker container stop laradock_php-fpm_1
docker container start laradock_php-fpm_1

コンテナにHTTPリクエスト実施後、ログを確認してみます。

今回は、下記コマンドで確認できます。

$docker-compose exec php-fpm cat /tmp/xdebug_log

原因は「remote_connect_back」

ログをみてみたところ、「192.168.11.10:9000」に接続するよう設定したつもりが、「172.21.0.1:9000」に接続しています。

Nginx側で、dockerのGatewayからリクエストが来ているように見えているようです。

Gatewayは、下記で確認。

この場合、下記設定を修正する必要があります。

xdebug.remote_connect_back=1

「xdebug.remote_connect_back」を有効にすると、$_SERVER[‘REMOTE_ADDR’]に対してDBGP接続通信を行うように試みるようです。

今回のケースでは、「xdebug.remote_host」で指定したIPに接続してもらいたいので、「xdebug.remote_connect_back」を無効にします。

再度imageの作り直し

「laradock/workspace/xdebug.ini」
「laradock/php-fpm/xdebug.ini」

を以下のようにします。

xdebug.remote_autostart=1
xdebug.remote_enable=1
xdebug.remote_connect_back=0
xdebug.cli_color=1
xdebug.profiler_enable=0
xdebug.remote_handler=dbgp
xdebug.remote_mode=req

xdebug.remote_port=9000
xdebug.remote_host=dockerhost
xdebug.idekey=PHPSTORM

修正後、イメージを作り直して動作確認したところ、無事リモートデバッグができるようになりました。

参考

https://confluence.jetbrains.com/display/PhpStorm/Docker+Support+in+PhpStorm

https://stackoverflow.com/questions/41423139/phpstormxdebug-hits-a-breakpoint-only-when-using-external-ip-address

スポンサーリンク