技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

Docker + CakePHP4.2 + VSCode でデバッグサーバに接続する

日中そういうことにドハマリしたので、日々の勉強がてらやってみて成功したのでメモしてみる。

ということで、上記バージョン以外ではどうかは保証外。

ディレクトリ構成

f:id:white-azalea:20210118194952p:plain

ということでこの状態からガンガン行こうか

xdebug の設定(php.ini

php.ini にこんな感じでケツに追記した。
元となるファイルは、PHP の Docker コンテナ起動してから「/usr/local/etc/php/php.ini-develop」をコピって来ればいいでしょう。

[xdebug]
xdebug.idekey      = "PHPVSCode"
xdebug.client_host = 'host.docker.internal'
xdebug.client_port = 9003
xdebug.mode          = "debug"
xdebug.output_dir         = "/root/codes/trace_logs"
xdebug.remote_handler     = "dbgp"
xdebug.start_with_request = yes
xdebug.log_level          = 10

デバッグ設定はすごく癖が強くて、Java ならデバッグサーバが立ち上がってそこに IDE が接続詞に行きますが、PHPデバッグサーバが指定のクライアントにデバッグ接続しに行くという流れがあるようです。
それを知らないとガチでハマります。

今回は Docker 内の PHP からホストマシンの 9003 ポートへ接続しに行きます。

Dockerfile

こっちはこんな感じ

FROM php:7-fpm-buster

RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y unzip curl wget git gcc libicu-dev

RUN docker-php-ext-install intl pdo pdo_mysql

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

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

ADD ./php.ini /usr/local/etc/php/

WORKDIR /root/codes

CMD cms/bin/cake server -H 0.0.0.0 -p 80
EXPOSE 80

最後の2行は、CakePHP のインストール後に入力しませう。

docker-compose.yml 設定

docker-compose.yml も一応晒します。

version: '3.7'
services:
  host:
    restart: always
    build: ./data/main
    environment: 
      TZ: 'Asia/Tokyo'
    volumes:
      - './sources:/root/codes'
    ports:
      - "8765:80"
    tty: true
    stdin_open: true

VSCode の設定

先ずはこのプラグインをインストール

marketplace.visualstudio.com

すると VSCodeデバッグアイコン内はこんな感じになります。

f:id:white-azalea:20210118200807p:plain

「create a launch.json file」 のリンクから PHPJSON ファイル開いて

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "XDebug on docker",
            "type": "php",
            "request": "launch",
            "port": 9003,
            "pathMappings": {
                // {docker上のdocument root}:{ローカルのdocument root}
                "/root/codes/cms":"/Users/armeria/workspace/PHP/cakePhp/sources/cms"
            },
            "ignore": [
                "**/vendor/**/*.php"
            ]
        }
    ]
}

これで準備 OK。

お試し

Docker 起動して

% docker-compose up -d
Starting cakephp_host_1 ... done
% 

VSCode のデバッガを立ち上げます。

f:id:white-azalea:20210118201543p:plain

適当なソース(デフォルト生成の先頭にクエリだけ突っ込んだもの)にブレークポイント仕掛けて

f:id:white-azalea:20210118201702p:plain

アクセスすると

f:id:white-azalea:20210118201815p:plain

(`・ω・´)シャキーン