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
ってな感じのウインドウに切り替わるので、ギアアイコンをクリック
ギアアイコンをクリックすると、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/
にマウントしてあるとしたら
というふうに読み取るといいと思います。
以下のようなコントロールできるツールが出てきます
実行するphpファイルの先頭くらいにBreakポイントをおいておきます。
DockerContainerでPHPを実行すると
VScode側では、動かしたPHPファイルの一番先頭で止まっていると思います。
あとはコントロールツールでステップ実行するなり焼くなりするといいですね!