サイト管理人Blog

cloudfreeで「さぁ始めましょう♪」

PHP デバッグ環境の構築 XDebug

2023-10-28 記載
概要:XDebugをセットアップしたら統合開発環境なみのデバッグ環境がPHPでも得られる
Keyword : XDebug, PHP, VisualStudioCode,

PHPのロジックはたいてい値をみて、その値次第で、値を右から左へ渡すだけ。ときにフォーマットを変えたりするぐらい。複雑なロジックは使わないからvar_dump()でたいていデバッグできますが、やはりステップ実行と変数ウォッチのできるデバッグ環境があれば快適で効率的です。

[Step1]VSCodeにPHP Debugをインストール

[Step2]VSCodeの設定
PHP IntelliSenseをインストールしてあれば
“php.validate.executablePath”: “C:\\pgm\\php8\\php.exe”,
“php.debug.executablePath”: “C:\\pgm\\php8\\php.exe”,
の2行は記述済みでそこへ追加します。※パスは環境次第

"php.validate.executablePath": "C:\\pgm\\php8\\php.exe",
"php.debug.executablePath": "C:\\pgm\\php8\\php.exe",
"php.validate.enable": false,
"php.suggest.basic": false,    
"launch": {
    "configurations": [{
        "name": "Listen for Xdebug",
        "type": "php",
        "request": "launch",
        "port": 9000
    }]
},

[Step3]php_xdebug.dllの取得
Windows用のDownloadページは以下。
https://xdebug.org/download
PHPのバージョン、TSはスレッドセーフ、OSにあったWindows binariesを取得。
”php_xdebug-*.dll”
をDownloadしたら
C:\pgm\php8\ext\ に配置。
※自分が何を入れているのかわかったほうがよいからphp_xdebug.dllにリネームはせずに
 以下のphp.iniとファイル名をあわせる方法がベター

[Step4]php.iniに設定追加
(どこでもいいけど; Module Settings ; の先頭あたり)
[XDebug]
zend_extension = “C:\pgm\php8\ext\php_xdebug-3.3.0alpha3-8.2-vs16-x86_64.dll”
xdebug.mode=debug
xdebug.start_with_request = yes
xdebug.client_host=127.0.0.1
xdebug.client_port=9000
xdebug.log_level=0

【注意: 2023.11.8追記】
xdebug.start_with_request = yes
と書くとコンソール実行(DOS窓などから)させたとき以下の表示が出て実行されなくなります。

Xdebug: [Step Debug] Time-out connecting to debugging client, waited: 200 ms. Tried: 127.0.0.1:9000 (through xdebug.client_host/xdebug.client_port).
The process cannot access the file because it is being used by another process.

これはまずいので回避策とされている
xdebug.start_with_request = trigger
にするとコンソール実行からはエラー無しですが、しかしVSCodeで止まりませんでした。
settingJSONとphp.iniそれぞれどう書けば両立するのか、は後日の調査課題として、とりあえずの解決策がこれ。

xdebug.start_with_request = yes
xdebug.log_level=0

をセットでいれると両立しました。
ただしPHP処理に恒常的に負荷がかかりそうで、1トランザクション1コネクションの1人使いの開発環境マシンならではの設定だと思います。
PHPのパフォーマンスをキープするなら、めったに使わないVSCodeのStepin-Debugのときだけ、yesに毎度書き換えるのがよいかもです。

テスト
C:\pgm\Apache24\htdocs
にtest.phpを作成して http://localhost/test.php で開きます。

Hello PHP Debug.<br>
<?php
$flag = false;
$count = 1;
do {
    echo "count = $count<br>";
    if ($flag) {
        $count = $count - 3;
    } else {
        $count++;
    }
} while ($count > 0 && $count < 10);

echo "count = $count<br>";
?>
Hello PHP Debug.
count = 1
count = 2
count = 3
count = 4
count = 5
count = 6
count = 7
count = 8
count = 9

7行目の
● if ($flag) {
にブレークポイントを付けて、[ F5 ]デバッグの開始。
ブラウザのリロードでタスクバーのVSCがフラッシュすれば設定は成功。
[ F10 ]ステップオーバーでループ6周ほどしてから
左ペインの$flagをクリックして値をfalseからtrueへ書き換え。
$count = $count – 3;
に処理が入るようになり、実行結果も変わりました。

Hello PHP Debug.
count = 1
count = 2
count = 3
count = 4
count = 5
count = 6
count = 3
count = 0

Excel VBAのデバッグのようにツマミをD&Dして好きなところから処理開始
というのはさすがに無理みたいですが、これだけ出来たらじゅうぶんです。

2024-02-01 追記
php.iniの[XDebug]セクションの設定はなかなか難しいようで、CPU使用率を100%にしてしまうApacheのプロセス残りが後日確認されました。
以下の投稿もあわせてご参照ください。

PHPの[XDebug]がCPU使用率100%にする

投稿へのコメントは コチラ(掲示板) へお願いします。

サイト管理人Blog