IDE とphp-xdebug でブレークポイントを使いたい。
IDE で php-debug を使ってブレークポイントを設定し任意の場所で変数の内容をダンプしたい。
はじめに
php の xdebug を使えば phpstorm や vscode などでブレークポイントを使うことができる。
接続形態
xdebug と php のプロセスは、次のような(ちょっと特殊?)接続の形態をとる。
phpstorm ( IDE/debugger ) 127.0.0.0:9000 <----connect --- phpサーバー
ここでは、矢印が右から左につながっていることがポイント。
PHPのランタイム(インタプリタ)がソースコードの実行時に、phpstorm(IDE)に接続することでデバッグ機構が動作する。
手順の概要(やること)
全体の流れは、こんな感じになる。
- xdebug を有効にする。
- phpをサーバ起動する( apache / php-fpm / builtin )
- ブラウザから php へリクエストを送る
- phpが実行されるとき xdebug を読み込む
- xdebug が実行を中断する
- xdebug が指定されたIDE(phpstorm) のIPアドレス:ポートに接続する
- IDEが接続を受け入れてデバッグスタート
ここでの、ポイント
接続がポイントになります。「IDEがポートをリッスンして待ち受ける」ということを忘れないでください。
builtin-sever と phpstorm の接続
phpにバンドルされている builtin-web-server とphpstorm を接続する。
ここでやること
- builtin-web-server を xdebug 有効で起動する。
- phpstorm がxdebug を待ち受ける。
- ブラウザで起動した builtin-web-server に接続する。
- ビルトインWebServerを起動する -ビルトインWebServerでphpのWEBアプリケーションを動かす。
builtin-web-server を起動して動作チェック。
最初に、空っぽのPHPプロジェクトを作っておく
プロジェクト内に、コンテンツを作る。
ビルトインWebServerをxdebug 付きで起動して、動作チェックする。
php -S 127.0.0.1:8000 -t public
起動した。
ブラウザで接続して起動をチェックする
ビルトインWebServerが動いたたら、今度はXdebugを有効にして起動する。
これで、Xdebugが有効になって起動する。
php -d xdebug.remote_autostart=1 \ -d xdebug.remote_enable=1 \ -d xdebug.remote_host=127.0.0.1 \ -d xdebug.remote_port=9000 \ -d xdebug.remote_connect_back=1 \ -d xdebug.remote_log=/tmp/xdebug.log \ \ -S 127.0.0.1:8000 \ -t public
もちろん、php-xdebug がインストールされている必要があるので、インストールされていない場合は、 有効にしておく。 例は、WSL1 のdebian/ubuntu です。
sudo apt install php-xdebug sudo phpenmod xdebug
phpstorm でXdebugの接続を受け入れる
右上のボタンを押して、ポートをリッスンして受け入れる。
初期状態
リッスン中
最近のバージョンだと、ボタンは次の場所
リッスンしたらブラウザからアクセス。
ブラウザから、ビルトインWebServerにアクセス
すると、ビルトインWebServerのXdebugが、PHPStormに接続に行く。
PHPStormがこの接続を受け入れるか聞いてくる。Acceptすると接続され、許可設定が記憶される。
ブレークポイントを設定する。
再度、ブラウザで開く。すると実行は一旦停止される。
phpstorm がアクティブになり、ブレークポイントで止まっていることがわかる。
ブレークポイントをResume(再開)してあげる
最後まで実行されると、ブラウザに結果が表示される。
Xdebugって超簡単に接続できます。
他の言語のデバッガと大きく異る。
phpのXdebugはちょっと癖があります。他の言語がSSH経由でサーバーとして起動中のプロセスにアタッチするのにたいし、PHP-Xdebug はサーバーがIDEへアタッチしてきます。理屈がわかればかんたんです。
今回のポイント
xdebugリモートデバッグではXdebugがIDEへ接続へ行く
使うにはXdebugがロードされる環境であればいい、サーバーはApacheでもビルトインWebServerでもphp-fpm でも php-cgi でもなんでもいい。IDEはリッスンが必須。。VisualStudio CodeでもPHPStormでもなんでもいい
次は、Laravelの起動とLaravelからのXdebugです。
Laravelのartisan serve は、その内部でシェル 経由でビルトインWebServerを起動するため、少し挙動が異なります。注意が必要です。
2024-11-23
スクショを更新。