XDebug 3をDockerコンテナ内でPHPデバッグ


私は最近XDebugを開発のセットアップで動作するようになったPhpStorm 走るinside WSL 2 Windows 10では、PHP/XDebugはWSC 2の内部でDockerコンテナ内で動作しますDocker Desktop ), だからここで私は驚くべき簡単な解決策を書いている-部分的に自分の将来の参照のための部分だけでなく、同様の状況で自分自身を見つける人を助けるために.
(私の極端な畳み込みの設定に落胆しないでください.

前書き


XDebugは、PHPのアプリケーションに対する要求を送信するのではなく、PHPアプリケーションとの対話に使用されている方法とは逆の動作をするため、構成するトリッキーにすることができます.XDebugは、コードがクライアントアプリケーション(つまり、あなたのエディターまたはIDE)に実行されている場所から要求を送信する方法を知っている必要があります.
あなたのセットアップが比較的単純であるならば、これはすばらしいですlocalhost:9003 しかし、あなたのセットアップがもう少し複雑であるならば、すなわち、PHP/XDebugが異なる物理的なマシンで、VMで、コンテナの中で、または、同様に動いているならば、それは箱から働きません.
XDebug 3は、XDebugがより簡単にするように設定された方法を一般的にオーバーホールすることによって、この全体の運動を少し簡単にします.しかし、セットアップが少し畳み込まれているならば、それはまだ正しいので、このポストを得ることができます.

肉とジャガイモ


さて、ここで私が終わったのです.
これはPHPの設定のどこかに置く必要があるビットですphp.ini , または通常、PHP拡張モジュールを設定する場所)
[Xdebug]
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.discover_client_host=true
xdebug.client_host=host.docker.internal
列によってこの行を行きましょうxdebug.mode=debug 許可step debugging (おそらくxdebugを使いたいものです.xdebug.start_with_request=yes 簡単にするために、すべてのリクエストの開始時にデバッグをアクティブにしたいXDebugに指示します.これを設定することをお勧めしますyes そして、それを忘れていますが、あなたが以前にこれをしたならば、あなたが特定のリクエストだけのためにステップ・デバッギングを活性化するのを好むということを知っているならば、この行を出てください、そして、XDebugはデフォルトですtrigger .
最後の2行はおもしろいところです.xdebug.discover_client_host=true XDebugにHTTPリクエストからクライアントのIPを抽出しようとしますxdebug.client_host それが動作しない場合に何を試みるかを指示します.
これらの設定をすべて設定すると、PHPアプリケーションへのリクエストを送信するたびに、どうなりますか
  • XDebugはステップデバッグをアクティブにするxdebug.mode is debug , and xdebug.start_with_requestyes ).
  • XDebugはHTTPリクエストからのホストへの接続を自動的に行います.$_SERVER['REMOTE_ADDR'] , $_SERVER['HTTP_X_FORWARDED_FOR'] , または設定したカスタムHTTPヘッダ).
  • 上記が動かなかったならば、それは我々に接続しようとすることに逆戻りしますxdebug.client_host , はhost.docker.internal , ホストのためのDNS名は、WindowsまたはMacOSの上でDockerデスクトップによって我々のために親切にセットされます(残念ながらLinuxででなく).
  • XDebugが両方を設定するという事実xdebug.discover_client_host and xdebug.client_host フォールバックとして、LinuxではMacOSやWindowsであるかどうか、Dockerを使用しているかどうかを設定するだけで、この設定を行うことができます.
    あなたがDockerデスクトップを使用しているならばhost.docker.internal フォールバックホストとして設定されていると、XDebugは常にホストへの道を見つけることができ、他のほとんどのセットアップでは、クライアントxdebug.discover_client_host ) だけで動作します.理論的には、このコンフィグが中断する唯一のシナリオは、dockerではないクライアント発見を中断するもの(例えば、不正な仮想マシン)を使用している場合ですxdebug.client_host 修理する.

    DocDebugイメージのXDebugのインストール


    もしあなたがDockerを使っているなら(そして、あなたがそうでなければ、私はそれについて考えることをお勧めします!)以下は、XDebugを開発中のイメージにインストールせずにインストールする方法の例ですmulti-stage builds :
    # (or your base image)
    FROM php:8.0-fpm-alpine as base
    
    # whatever you do to set up your image
    # for example:
    #   - copying your source code
    #   - installing extensions
    #   - doing a `composer install`
    
    FROM base as development
    
    RUN pecl install xdebug && docker-php-ext-enable xdebug
    
    FROM base as production
    
    # whatever you do to prepare your image for production
    # for example: removing packages you don't need in production
    

    結論


    それだ!これで、XDebugの設定をする必要があります.
    あなたがこの設定を使用している場合、それはあなたのTwitter上で私にエールをしてください、私はおそらくこのポストにメモを追加してください、それは動作しませんセットアップを発見した!