Linux ( docker (PHP + Apache + Xdebug ) )<-> Windows + VS Code メモ

タイトルのような環境でPHPの開発をするときのメモ。


1行でまとめると

xdebug_break()を入れたテスト用phpファイルを作る&Docker側のxdebugのログをチェックしましょうね。


Dockerfileとかソースとかを一緒に管理したかった

なのでWindowsのフォルダ構成を

c:\project VScodeのプロジェクトフォルダ

c:\project\ docker Dockerfileとか

c:\project\www\html ソース

みたいにした。このプロジェクトフォルダを深くしたのが迷う元でした。


環境

Ubuntu 16.04

・Docker

- apache+PHPのイメージにXdebug用設定を入れたもの(後述)

Windows

・VS Code


DockerfileにXdebug用設定を入れる

Dockerfile

FROM php:7.0-apache

RUN apt-get update \
&& apt-get -y install git apt-utils \
&& docker-php-ext-install pdo_mysql mysqli mbstring \
&& pecl install xdebug
:
# for Xdebug
COPY zend.ini /usr/local/etc/php/conf.d/zend.ini
:

zend.iniじゃなくてもいいんですが、Dockerfileと同じ場所にzend.iniを置くことと、Linux側のパスに注意。

zend.ini

zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so

[XDebug]
xdebug.remote_autostart=1
xdebug.remote_enable=1
# WindowsマシンのローカルIP
xdebug.remote_host=192.168.254.123
♯ 9000でもいいです
xdebug.remote_port=9001
xdebug.remote_log=/tmp/xdebug.log
xdebug.remote_mode=req
# VS Codeのnameと違っててもよさげ
xdebug.idekey=xdebug
xdebug.remote_handler=dbgp

これで docker build ・・・ して、docker run -p 80:80 -d wwwなどで動かしましょう。9001番のポートはdocker側からのアクセスなので -p で指定する必要はありません


VS CodeのXdebug設定

launch.json

{

"version": "0.2.0",
"configurations": [

{
"name": "xdebug1",
"type": "php",
"request": "launch",
"port": 9001,
"pathMappings": {
"/var/www/html": "${workspaceFolder}\\www\\html"
}
}
]
}

ポイントはportpathMappingportはzend.iniに書いたのと同じにしましょう。ここまではよくある話。もう1つのpathMappingですが、${workspaceFolder}が指すのは、c:\projectなので注意。(トラブルシューティングのテスト用phpでチェックできます)


トラブルシューティング


  • ルーターのファイアウォール設定


    • ローカルマシン同士の通信ができるように。



  • Linuxのファイアウォール設定


    • ufwとかで9001番のアウトバウンドを閉じないように(色々やっててインバウンドと間違えて閉じてませんか?私は略)



  • Windowsのファイアウォール設定


    • ググってね。



  • /tmp/xdebug.logをチェック。

<- context_names -i 53 -d 0

-> <response xmlns="urn:debugger_protocol_v1"
:

とか出ていたら、とりあえずdockerからWindowsは見えてます。これでブレイクポイントで止まらないときはpathMappingが間違えているので、後述のテスト用phpで確認しましょう。

Log opened at 2018-08-06 ....

I: Connecting to configured address/port: 192.168.254.123:9001.
E: Time-out connecting to client (Waited: 200 ms). :-(
Log closed at 2018-08-06 ...

とか出ていたら、ポート番号間違えてます。



  • /tmp/xdebug.logが作成されない?


    • そもそもxdebug入ってない or 入れ損ねている。

    • VS Codeでデバッグモードにして、デバッグしたいファイルにブレイクポイントつけて、ブラウザで当該ファイルにアクセスしたときに作られるぽいので、焦らないw



  • テスト用php。xdebug_break()に到達したとき、pathMappingが間違っていたらVS Codeにダイアログが出て教えてくれます。


<?php

xdebug_break(); // ここで止まるはず。止まらない時はWindowsファイアウォール設定でブロックされています。
phpinfo();

May the 'debug' force be with you...