3
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-08-06

タイトルのような環境で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...

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5