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

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 = yes``は``no``にしておきましょう


# インストール編(VScode+php-debug側)
VScodeで導入したのは以下のPHP-debug

![スクリーンショット 2022-10-31 17.54.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19107/9f1bd35d-1417-a792-a9bc-e4f09a75b953.png)

このアイコンをクリックすると
![スクリーンショット 2022-10-31 17.56.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19107/bcf3c5f8-48b8-0a37-e2de-192785c1e129.png)


ってな感じのウインドウに切り替わるので、ギアアイコンをクリック
![スクリーンショット 2022-10-31 17.57.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19107/4765b666-b90b-4079-896d-03abb875d47a.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19107/b707ee08-ce19-4e9e-3eb7-8aee6cc79861.png)

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

![スクリーンショット 2022-10-31 18.05.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19107/7cb2a1d2-b862-69f8-c66d-6ec71b274d4a.png)



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

![スクリーンショット 2022-10-31 18.10.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19107/ff069aa1-8c2c-2fab-5d53-ea23f65871f5.png)


DockerContainerでPHPを実行すると
VScode側では、動かしたPHPファイルの一番先頭で止まっていると思います。
![スクリーンショット 2022-10-31 18.11.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19107/803d069b-2817-d30b-9a88-cfc695493acb.png)

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