Help us understand the problem. What is going on with this article?

Dockerで構築したPHP環境をxdebugでデバッグ(vscode)

More than 1 year has passed since last update.

はじめに

dockerで構築したPHP環境でステップ実行する際の手順です。
エディターはvscodeでの手順になります。
使用しているdockerはdocker for macのversion 18.06です。

今回説明しないもの

  • Dockerの基本的な使い方
  • vscodeの基本的な使い方

ディレクトリ構造

今回の設定のディレクトリ構造です。

├── docker
│   ├── Dockerfile
│   └── php.ini
├── docker-compose.yml
└── src
    └── index.php

Dockerfileの設定

Dockerfileを書いていきます。

FROM php:7.2-apache

RUN pecl install xdebug \
  && docker-php-ext-enable xdebug

WORKDIR /var/www

DockerhubからPHP公式が配布しているwith apacheのものを使用しています。
そこにxdebugをインストールします。
またdocker-php-ext-enableでpecl拡張を有効化できるのでdocker-php-ext-enable xdebugを実行します。
上記を実行することで/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20170718/xdebug.so

が出力されます。(内容は個人によって異なる可能性があります)

docker-compose.ymlの設定

compose fileのversionが3.7なのでそれに合わせて記述しています。

version: "3.7"
services:
  php:
    build:
      context: ./docker
    ports:
      - "8081:80"
    tty: true
    stdin_open: true
    volumes:
      - ./src:/var/www/html
      - ./docker/php.ini:/usr/local/etc/php/php.ini

volumesで追加しているphp.iniですが、デフォルトではdockerにはphp.iniはないので、ローカルにphp.iniを作ってdocker側に追加させています。
今回の場合はローカルに書いたphp.iniはDockerfileと同じ場所に配置していますが、変更する場合はパスを変更してください。

php.iniの内容は以下のようになっております。

[xdebug]
xdebug.remote_enable=1
xdebug.remote_autostart=1
; ホスト側のIP
; host.docker.internalはdockerのhostマシンのIPを解決してくれます。
; hostマシン以外のIPの場合は適宜IPを調べて設定してください。
xdebug.remote_host=host.docker.internal
; 空いているport番号(xdebugのデフォルトは9000)。私の場合は他と競合していたので9001に設定。
xdebug.remote_port=9001
; xdebugの出力するログの場所。今回は適当に/tmp配下に。
xdebug.remote_log=/tmp/xdebug.log

vscodeの設定

docker側の設定はほぼ終わったので、vscodeの方の設定を行います。
まずはPHPDebugの拡張機能をインストールしましょう。
インストールできましたらlaunch.jsonの設定を行います。
vscodeの画面の左側にある虫のようなマークをクリックしてください。
すると下の画像のような表示になるかと思います。
スクリーンショット 2018-09-01 19.26.44.png
歯車のマークを押すと環境を聞かれますのでPHPを選択してください。
選択しますと、launch.jsonが自動的に作成され編集画面になります。
表示されましたら、launch.jsonのconfigrationsに下記を追記してください。

    "configurations": [
        {
            "name": "XDebug on docker",
            "type": "php",
            "request": "launch",
            "port": 9001,//php.iniで設定したxdebug用のport番号
            "pathMappings": {
                // {docker上のdocument root}:{ローカルのdocument root}
                "/var/www/html":"/Path/to/your/local/root"
            }
        }
    ]

これで一旦vscodeの設定はおしまいです。

デバッグ開始

では最後に実際にステップ実行を行います。
まずはdocker-compose up -dでコンテナを起動してください。
できましたら、vscodeの方でソースコードにブレークポイントをつけてみましょう。
スクリーンショット 2018-09-01 21.54.05.png
上の画像のようにソースの行番号の左をクリックするとブレークポイントを設定できます。
また、画面の左にある緑色の矢印もクリックしておきましょう。
クリックしますと、ブレークポイントまでphpが実行された際にそこでストップするようになります。
やめる場合は画面の中央にあるツールバーの停止ボタンを押してください。
この状態でlocalhost:8081にアクセスするとブレークポイントで実行が停止し、ステップ実行が可能になります。
また、左の方に現在変数に入っている値なども見ることができたりしますので、各々ご活用ください。

以上、Dockerで構築したPHP環境をxdebugでデバッグする方法でした。

参考

編集履歴

  • 2019/05/10 コメントでいただいた指摘に基づきdocker-php-ext-enable xdebugおよびdocker.host.internalの記述を追加
gigosa
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした