ぷっぽプログラミング備忘録

linux, javascript, php, C#, そのうちScalaとかアプリ開発とかやってみたいです。

VSCodeで開発 ubuntu20.04 に php のxdebugをインストール(php8.1の場合)

  • DockerFileで以下内容を記述
...なんやかんや

RUN apt install -y php8.1-xdebug

...なんやかんや

(DockerFileのお作法的には、他のapt installしているものと一緒にまとめるべきですが、そういうのは動いてから調整すればいいと思うので)

  • コンテナのphp.iniに以下設定を追加
[XDebug]
xdebug.client_host = host.docker.internal
xdebug.client_port = 9003
xdebug.mode = debug
xdebug.start_with_request = yes

※重要なポイントは、「host.docker.internal」です。 これはDocker For Desktopでしか使えないらしいのですが、「dockerコンテナから見たホストPCのIP」に適宜変換してくれるもののようです。 xdebugの動いている環境(dockerコンテナ)から見たクライアント(xdebugの利用者)とは、 VSCodeを動かしてる環境(ホストPC)ということで、これを指定します。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9003,
            "pathMappings": {
                "【コンテナのプロジェクトのディレクトリ】":"${workspaceRoot}【VSCodeのルートディレクトリから、プロジェクトのディレクトリへの相対パス】"
            }
        }
    ]
}

※pathMappingsは、xdebugの設定でおなじみの、コンテナのディレクトリとxdebugのクライアント側のディレクトリのマッチング設定を記述します。
たとえば、 apache2を動かしているコンテナ(xdebugのサーバーが動いているコンテナ)のプロジェクトのディレクトリが/var/www/html/laravelの場合
かつ
ホスト(xdebugのクライアント)でVSCodeを動かしていて、VSCodeで開いているソースのルートディレクトリが/foo/bar/srcで、/foo/bar/src/laravelにプロジェクトのソースを配置している場合は、

            "pathMappings": {
                "/var/www/html/laravel":"${workspaceRoot}/laravel"
            }

となります。${workspaceRoot}は文字通り、VSCodeワークスペースのルート(/foo/bar/src)に変換されるようです。

  • コンテナを再作成する(イメージ再ビルドして、コンテナを立ち上げる)
docker-compose down
docker-compose build
docker-compose up -d

参考

PHP × Xdebug × Docker × VSCodeで快適な開発環境をつくってみた - Qiita

ubuntu 18.04 LTSで、PHPをデバッグする方法 - ふみちゃんの物欲日記