タイトルのような環境で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"
}
}
]
}
ポイントはport
とpathMapping
。port
は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...