PHPStormでXdebugを使うときのメモ(Docker)

前提

  • Docker
  • PHPStorm
  • Xdebug3系

参考

blog.junpeko.com

流れ

  • Docker内にXdebugをインストールする(3系をインストールする)
  • Xdebugを有効にする
  • PHPStormでRemoteDebugの設定をする(Dockerの内部のファイルとのPathMappingなど)

Dockerの準備

  • DockerにXdebugをインストールする
    • これはアプリケーション用(PHP用)のDockerコンテナであって、別途nginxを作っている

参考にさせていただいたサイト

qiita.com

Dockerfile

FROM php:8.1-fpm-bullseye
SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]

# timezone environment
ENV TZ=UTC \
  # locale
  LANG=en_US.UTF-8 \
  LANGUAGE=en_US:en \
  LC_ALL=en_US.UTF-8 \
  # composer environment
  COMPOSER_ALLOW_SUPERUSER=1 \
  COMPOSER_HOME=/composer

COPY --from=composer:2.1 /usr/bin/composer /usr/bin/composer

RUN apt-get update && \
  apt-get -y install git libicu-dev libonig-dev libzip-dev unzip locales && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/* && \
  locale-gen en_US.UTF-8 && \
  localedef -f UTF-8 -i en_US en_US.UTF-8 && \
  mkdir /var/run/php-fpm && \
  docker-php-ext-install intl pdo_mysql zip bcmath && \
  composer config -g process-timeout 3600 && \
  composer config -g repos.packagist composer https://packagist.org

COPY ./infra/docker/8.1/php/php-fpm.d/zzz-www.conf /usr/local/etc/php-fpm.d/zzz-www.conf
COPY ./infra/docker/8.1/php/php.ini /usr/local/etc/php/php.ini
COPY ./infra/docker/8.1/php/start-container /work/start-container/
COPY ./src/ /work/backend/

WORKDIR /work/backend

RUN mkdir -p storage/framework/cache/data && \
    mkdir -p storage/framework/app/cache && \
    mkdir -p storage/framework/sessions && \
    mkdir -p storage/framework/views && \
    mkdir -p storage/logs && \
    mkdir -p bootstrap/cache && \
    chmod -R 777 storage && \
    chown -R www-data:www-data /work/backend && \
    chmod +x /work/start-container/start-container && \
    composer install

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

EXPOSE 9000

解説

こちらでXdebugのインストールと有効化をしている

# install xdebug
RUN pecl install xdebug && docker-php-ext-enable xdebug
余談

以下のstart-containerというファイルは、laravel sailのスタートアップ時のシェルをほぼ参考にしているが、Dockerコンテナ内と、ホスト側の所有権の解決をしている部分)
所有権のために、Dockerで使用するユーザのIDをあわせている

    chmod +x /work/start-container/start-container && \

以下がstart-container
WWWUSERが設定されている場合にはusermodによってユーザのIDを変更している

#!/usr/bin/env bash

if [ ! -z "$WWWUSER" ]; then
    usermod -u $WWWUSER www-data
fi

php-fpm

php.iniの準備

php.iniに以下を追記

[xdebug]
xdebug.mode=debug
xdebug.start_with_request = yes
xdebug.client_host = host.docker.internal

最初にxdebug.mode=debugだけを書いていてハマっていた。 xdebug.client_host = host.docker.internalが重要と思われる(デバッグ用ホスト)

PHPStormの設定

まずはDockerコンテナを起動冴えておく(上記のアプリケーション用のDockerコンテナ)

f:id:y-ni-shi:20220109172247p:plain

画面のように、PHPのバージョン、Dockerコンテナなどを設定する コンテナとのPath Mappingが重要(Xdebugブレークポイントとまらないケースはこのあたり確認)

参考

pleiades.io

CLI Interpreter

f:id:y-ni-shi:20220109172511p:plain

こちらも同様に設定する

f:id:y-ni-shi:20220109172529p:plain

このようにXDebugがコンテナ内で有効になっている場合にはXDebugのバージョンが表示される(表示されない場合にはXDebugが有効になっていないことになる)

XDebugの設定

f:id:y-ni-shi:20220109173100p:plain

ポートを注意する(XDebug3系から9003に変更されたらしい)

Run/Debug Configurationsの設定

f:id:y-ni-shi:20220116131349p:plain

このように、デバッグ対象のサーバを選ぶ(チェックボックスを一回いれてサーバを選択し、またチェック解除)

ブラウザのデバッグ

このあたり参考に

https://y-ni-shi.hatenablog.com/entry/2021/11/21/021438?_ga=2.201150766.1052439647.1641648968-1233221826.1641177067#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%8B%E3%82%89%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0