3
2

More than 1 year has passed since last update.

今頃VScode + php-debug + xdebugに取り組む

Last updated at Posted at 2022-10-31

PHPのデバッグって print_r($data);exit();ばかりやってました・・
とても効率悪い・・

なぜ、いままでxdebugに取り組まなかったのかが不思議・・

ということで、xdebugを入れてみました。

最近はDocker,docker-composeで環境を作ることがほとんどですので、その前提で・・

でも、そもそもxdebugってどうやって動いてるのかわからなかったけど
どうも、PHP実行環境にインストールするxdebugは言ってしまえばクライアント。
サーバに当たるのはvscodeにインストールしたphp-debug側になるようです。

ググってるとよく出てくるPort9003は要はphp-debugがListenしているポートを指定し、
xdebug(PHPを実行している)側は、php-debugが起動・ListenしているIP/Portに向けて、
どう振る舞えばいいかを聞く感じだった。

こんな構成

[Mac [vscode/PHP-debug (listen port 9003)]] <-- [Docker container [server PHP xdebug] ]

このあたりの理解が無いと設定の意味がわからないことになる。
(大体の記事はそのあたりの説明がすっぽり抜けてる感じがする)

ちなみにDocker containerからvscode/PHP-debugを実行しているMacのIPアドレスは
host.docker.internal
というHost名で解決できる。

#インストール編(docker側)

Dockerfile内のPHP導入部分は以下のような感じ(大本イメージはcentosを使っています)

FROM centos:7

WORKDIR /var/www

RUN yum -y update && yum -y install yum-utils httpd telnet git zip unzip

# install php
RUN yum -y remove php-*
RUN yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN yum -y install --enablerepo=remi,remi-php82 php php-mbstring php-xml \
  php-xmlrpc php-gd php-pdo php-pecl-mcrypt php-mysqlnd php-pecl-mysql php-pecl-zip php-pecl-xdebug php-devel

〜〜〜〜

これでphp8.2とワイ的に必要なモジュールとxdebugがインストールできます

php.iniに

xdebug.mode=debug
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.start_with_request = yes

を追記する様にします
(php.dに書くといいんでしょうね)

https://xdebug.org/docs/all_settings
を参考に

設定 内容
xdebug.mode=debug xdebug設定を利用 offで未使用
xdebug.client_host=host.docker.internal デバッガーが動いているマシン host.docker.internalはDockerのホストマシン
xdebug.client_port=9003 デバッガーが待ち受けているPort
xdebug.start_with_request = yes PHPプログラムが起動したら直ぐデバッガーが反応するようにする。通常はnoでいいと思うけど、動作確認のためにyesとしておく

macのTerminalで

$ nc -l 9003

を実行しつつ、Docker Container側でphpを実行すると

$ nc -l 9003
477<?xml version="1.0" encoding="iso-8859-1"?>
<init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" fileuri="file:///var/www/bin/PHPファイル名.php" language="PHP" xdebug:language_version="8.2.0RC5" protocol_version="1.0" appid="321"><engine version="3.2.0RC1"><![CDATA[Xdebug]]></engine><author><![CDATA[Derick Rethans]]></author><url><![CDATA[https://xdebug.org]]></url><copyright><![CDATA[Copyright (c) 2002-2022 by Derick Rethans]]></copyright></init>

って感じでXMLが流れてきたらxdebugの対応はOKです。

debug.start_with_request = yesnoにしておきましょう

インストール編(VScode+php-debug側)

VScodeで導入したのは以下のPHP-debug

スクリーンショット 2022-10-31 17.54.48.png

このアイコンをクリックすると
スクリーンショット 2022-10-31 17.56.50.png

ってな感じのウインドウに切り替わるので、ギアアイコンをクリック
スクリーンショット 2022-10-31 17.57.22.png

ギアアイコンをクリックすると、launch.jsonファイルを編集するモードになると思います。
(このファイルはプロジェクトのディレクトリに作られるようですね)

一旦わかりやすく(試行錯誤の上)、以下のようにしました。

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

        {
            "name": "Listen for Xdebug 9003 ProjectABC",
            "type": "php",
            "request": "launch",
            "port": 9003,
            "pathMappings": {
                "/var/www/": "/Users/ワイのルートディレクトリ/プロジェクトディレクトリ/"
            }
        },
        {
            "type": "pwa-node",
            "request": "launch",
            "name": "Launch Program",
            "skipFiles": [
                "<node_internals>/**"
            ],
            "program": "${file}"
        }
    ]
}

"pathMappings"は、
Mac上の"/Users/ワイのルートディレクトリ/プロジェクトディレクトリ/"
Docker上では/var/www/にマウントしてあるとしたら
というふうに読み取るといいと思います。

これで保存をして、三角矢印をクリックすると
スクリーンショット 2022-10-31 18.05.28.png

以下のようなコントロールできるツールが出てきます

スクリーンショット 2022-10-31 18.05.46.png

実行するphpファイルの先頭くらいにBreakポイントをおいておきます。

スクリーンショット 2022-10-31 18.10.15.png

DockerContainerでPHPを実行すると
VScode側では、動かしたPHPファイルの一番先頭で止まっていると思います。
スクリーンショット 2022-10-31 18.11.58.png

あとはコントロールツールでステップ実行するなり焼くなりするといいですね!

3
2
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
2