VSCode で Xdebug

Xdebugのリモートデバッグ機能を使ってワンランク上のPHP開発環境を手に入れましょう。

と言っても実はリモートデバッグどころかXdebug自体はじめての経験なので、ところどころ変なところなどあるかもしれませんがお手柔らかにお願いしますよ。

今回は今波に乗ってるDockerで環境を構築します。ただ、DockerHub公式の php イメージには Xdebug がインストールされていないため php イメージをもとに Dockerfile で Xdebug をインストールしたイメージを作る必要があります。

面倒な方は僕が作成したイメージを使ってください。以下のコマンドでイメージを取得できます。

$ docker pull hysryt/php-xdebug:7.2-2.6

Dockerfile は以下のようにしています。
やっていることは Xdebug のインストール、有効化、設定ファイルの追加だけです。

FROM php:7.2-apache

RUN pecl install xdebug-2.6.1 && docker-php-ext-enable xdebug
ADD ./xdebug.ini $PHP_INI_DIR/conf.d/

php用の設定ファイルは以下のようにしましたが、かなり必要最低限の設定しかしていません。実際に使う場合はさらに書き加えた方がいいでしょう。

[XDebug]
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_host = host.docker.internal

GitLab にもあげてあるのでよかったらみてみてください。

では次にこれを docker-compose で起動します。

xdebug-test/
  |- docker-compose.yml
  `- public/

こんな感じのフォルダ構造にして、下記を docker-compose.yml として保存します。

version: '3'
services:
  httpd:
    image: hysryt/php-xdebug:7.2-2.6
    ports:
      - '8080:80'
    volumes:
      - ./public:/var/www/html

そして docker-compose up を実行すれば public 内のファイルに http://localhost:8080 でアクセスできるようになります。

これでサーバ側の設定は完了なのでクライアントの VSCode の設定に移ります。
まず拡張機能の PHP Debug をインストール、有効化します。

PHP Debug を有効化できたら、上で作った public フォルダを VSCode でワークスペースとして開き、デバッグウィンドウに切り替えます。

左側にデバッグ用のパネルがでるので、一番上の歯車をクリックし、PHPを選択します。

すると .vscode/launch.json が生成されるのでこのファイルに設定を加えていきます。

        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000
        },

こうなっている部分に pathMapping 設定を加えて、

        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "pathMappings": {
                "/var/www/html/": "${workspaceFolder}/public"
            }
        },

こんな感じにします。

VSCode側の設定はこれだけです。

public フォルダに index.php を作って例外を投げてみます。

<?php

throw new Exception();

この状態で http://localhost:8080 にアクセスするとそのままエラー画面が出力されます。

では VSCode のデバッグ機能を使ってみましょう。VSCode のデバッグを開始します。開始するにはデバッグパネルの上の右向き三角を押します。

デバッグを開始したらまた http://localhost:8080 にアクセスしてみます。すると、

VSCode 側で例外を検知できました。やったね。

とまあこんな感じです。

つくづく思うけど説明下手だなあ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です