12
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

vscode↔Docker内PHPでリモートデバッグしたときにハマったこと

Last updated at Posted at 2019-04-02

Dockerコンテナの中で動くPHPプログラムに、XDebugを使ったリモートデバッグを行う という例は割とよく見かけますが、それでも割とハマったのでハマったところをメモ。

構成

  • Windows 10 Home(1809 Ver 非Insider Preview)
  • Virtual Box(Docker Toolbox)
  • PHP 5.5.9
  • XDebug 2.2.3
  • Visual Studio Code 1.32.3

気をつけるべきところ

XDebugでのデバッグにおいて気をつけるべきところ(覚えておくべきところ)

  • XDebugでデバッグをするとき、Visual Studio Codeはサーバ側、PHPインタプリタはクライアント側になる(PHPインタプリタからVisual Studio Codeにアクセスする)
    • なので、DockerコンテナのEXPOSEなどは不要。むしろそれをするとかえって厄介なことになることがある)
  • vscode上のlaunch.jsonで指定するpathMappingsで指定するDockerコンテナ側のディレクトリパスは、ルートディレクトリからのパスとなる。HTTPサーバ上で見えているディレクトリ などではない。
  • ワークスペースを作成していても、Windows PC側のフォルダパスは、基本的に${workspaceFolder}でOK。

Dockerを使う上で気をつけるべきところ

  • DockerコンテナからDocker Toolboxを動かしているPC(Windows PC)を見るときと、Windows PCからDockerコンテナを見るときのIPアドレスを覚えておく
    • Windows PC→Dockerコンテナの場合、IPアドレスは、ホストOS(Virtual Boxで走っているOS)のifconfigで取得できるeth1の値(Virtual Boxの設定>ネットワーク>アダプター2で選択しているホストオンリーアダプターと同じネットワークのアドレスになるはず)
    • Dockerコンテナ→Windows PCの場合、ホストOSのip rで取得できる値(先頭行にdefault via ××× dev eth0などと出力されるので、その×××の値)

準備

Dockerコンテナ側の準備

Dockerコンテナ側の準備は

  • XDebugをインストールすること
  • XDebug.iniに設定をすること
  • デバッグ対象のPHPファイルを正しく配置すること

となる。php5の場合は、apt-get install php5-xdebug -yしておくこと(7以降の場合は適宜読み替えてください)。

XDebug.ini

Dockerコンテナ→Windows PCのIPアドレスは、今見ている限り変わってないので、build-argsなどで設定したりせずとも決め打ちで良いと思われます。

xdebug.ini
zend_extension=xdebug.so

[XDebug]
xdebug.dump_undefined = 1
xdebug.remote_enable = 1
xdebug.remote_host=10.0.2.2
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_autostart = 1
xdebug.remote_log=/var/log/xdebug.log

Visual Studio Code側の準備

  • PHP Debugの拡張をインストールしておくこと
  • launch.jsonを正しく設定すること
  • 該当PHPファイルを開き、ブレークポイントを仕掛けておくこと
launch.json
・・・
    {
      "name": "XDebug on Docker",
      "type": "php",
      "request": "launch",
      "port": 9000,
      "pathMappings": {
        "/app/*** プロジェクトフォルダまでのパス ***": "${workspaceFolder}"
      }
    },
・・・

Dockerfileの注意点

とくになし。強いて言うならポート9000をEXPOSEしたり、docker run-p 9000:9000などとしたりしないこと!(これをしていたせいでハマった可能性大)

いざ実行

  1. 最初に、Visual Studio Codeでデバッグの開始を行う(PHPインタプリタの接続待ち)
  2. PHPファイルの任意の箇所にブレークポイントを設置する
  3. DockerコンテナのPHPファイルを、Windows PC側で表示する
  4. Enjoy.

感想

  • Dockerコンテナ↔外側のPCとのアクセスは確認する方法がそれぞれ違うので気をつけること。
  • 可能なら事前に外側のPCにphp -S 127.0.0.1:8080あたりで作ったサーバにDockerコンテナからアクセスしてみるなど、なんらかの形で導通確認をしておくとよい(pingだけでは実はループバックしてるのかDockerのホストOSに飛んでるだけなのか、ちゃんと外側のPCに飛んでいるのか区別が付きづらい)。
  • それでもつながらない ということは割とよくあるので、どういう仕組みでつながっているのかを理解しておくことは重要。
  • リモートデバッグは動き始めれば快適(サーバが物理的に離れてればまた感覚が変わってきそう)。print()デバッグとかerror_log()デバッグでお茶を濁そうとしたりせず、素直に使いましょう。

参考にしたもの

12
18
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
12
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?