- 記事一覧 >
- ブログ記事
PHP7&Xdebug2&VS Code SSH Remoteで標準launch.jsonを理解しながらデバッグ
はじめに
PHP7 を VS Code(Visual Studio Code) SSH Remote 環境で PHP Debug 拡張機能を使って、デバッグをしました。
その手順と、その際に自動生成された launch.json の3種類のデバッグ方法について、検証しましたので、紹介していきたいと思います。
3種類のデバッグ方法とは、
"Listen for Xdebug"
"Launch currently open script"
"Launch Built-in web server"
のことです。
自動生成された launch.json については、バージョンによって変わるかもしれません。あくまでも今回の環境の場合になります。
また、この記事は、launch.json に書かれた内容をメインで説明していますので、網羅的な説明はありません。
この記事で採用している Xdebug は、Xdebug3 ではありません。Xdebug2 です。
【検証環境】
VS Code 1.83.0(Windows10 PRO)
拡張機能 PHP Debug v1.33.0
と
別記事「CentOS8.3 に apache2,php,postgresql,openldap-client をインストール」で構築した
CentOS Linux release 8.3.2011
PHP 7.4.6
php-pecl-xdebug-2.9.5
Apache 2.4.37
です。Apache 2.4.37 の方は、デバッグ方法によっては必要ありません。
SSH Remote デバッグ
VS Code で PHP が動いているサーバーへ SSH Remote 接続を行います。 別記事「VS Code で Raspberry Pi Desktop へ SSH 接続しようとしたらエラーになった」で詳しく説明していますので、細かい説明は省きます。
VS Code に「Remote Development」拡張機能または、「Remote - SSH」拡張機能をインストールします。
秘密鍵、公開鍵を作成します。
C:\Users\admin>ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\admin/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\admin/.ssh/id_rsa.
Your public key has been saved in C:\Users\admin/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:2wnfXYUhsDkW78InNqiT4/m11rQJ9i+lvDQN1dbYqQQ admin@WIN10PRO64
The key's randomart image is:
+---[RSA 2048]----+
| oE. . |
| =.. *o|
| = ..+.*|
| + o.....|
| S * +. .|
| o *oB.+.. |
| = ..=*+=o |
| . + ..oO. |
| o.... .+. |
+----[SHA256]-----+
公開鍵の id_rsa.pub を PHP が動いているサーバーへ転送します。
/root/.ssh/authorized_keys に追記します。
root 権限で作業しています。
今回、VS Code SSH Remote 接続は、root 権限で接続します。
/root/.ssh が無い場合は、
mkdir /root/.ssh
chmod 700 /root/.ssh
で作成します。
# cat /home/admin/id_rsa.pub >> /root/.ssh/authorized_keys
# chmod 600 /root/.ssh/authorized_keys
sshd の設定を変更して、root 権限でログイン可能にします。
# vi /etc/ssh/sshd_config
PermitRootLogin yes
と設定し、sshd を再起動します。
# systemctl restart sshd
VS Code 左下部分をクリックして、リモート接続します。
PHP Debug 拡張機能追加
「PHP Debug」拡張機能(作者:Xdebug)を追加します。
Xdebug2 導入
インストールメディア CentOS-8.3.2011-x86_64-dvd1.iso をマウントして、php-pecl-xdebug-2.9.5-1.module_el8.3.0+396+9a0d79d6.x86_64.rpm をインストールします。
# mount /dev/cdrom /media
# rpm -i /media/AppStream/Packages/php-pecl-xdebug-2.9.5-1.module_el8.3.0+396+9a0d79d6.x86_64.rpm
Xdebug2 と言っているのがコレです。
Xdebug2 のインストール方法は、この手順に限らず、いろいろあると思います。
# vi /etc/php.d/15-xdebug.ini
xdebug.remote_enable = true
xdebug.remote_autostart = true
xdebug.remote_port = 9003
を設定します。
xdebug.remote_enable = true
: Xdebug のリモートデバッグ機能を有効化します。これにより、IDE(例えば Visual Studio Code や PhpStorm など)が Xdebug と通信できるようになります。
xdebug.remote_autostart = true
: PHP の実行時に自動的にデバッグを開始することを指定します。これにより、特定の GET/POST 変数を送信したり、特定の Cookie を設定することなく、デバッグセッションを開始できます。
xdebug.remote_port = 9003
: Xdebug がリモートデバッグ接続を待ち受けるポート番号を指定します。この値は IDE の設定と一致している必要があります。
;xdebug.remote_enable = false
;xdebug.remote_autostart = false
;xdebug.remote_port = 9000
でコメントアウトされていました。ポートを 9003 に変更する理由は、この後、launch.json が 9003 で設定された状態で生成されるからです。
後で出てくる話をここで言ってしまうと、launch.json が 9003 で設定された状態で生成される理由は、launch.json が Xdebug2 用ではなく、Xdebug3 用だからです。Xdebug3 になり、デフォルトポートが 9000 から 9003 に変わりました。
launch.json 生成
今回、デバッグ対象を /var/www/html とします。
VS Code で /var/www/html を開いて、実行とデバッグ ボタンを押して、launch.json ファイルを作成します をクリックして、launch.json を生成します。
launch.json が自動生成されます。
.vscode フォルダも作成されて、今回の場合、.vscode/launch.json に作成されています。
内容は、以下です。
注意:コメントで意味を追記しています。コメントのところは、実際と異なりますが、設定内容は実際の作成直後と同じです。
{
// launch.jsonのバージョンを指定します。(現状おそらく、意味ないです。)
"version": "0.2.0",
// デバッグの構成を配列で定義します。複数の構成を作成できます。
"configurations": [
{
// この構成の名前を指定します。VS Codeのデバッグ画面で選択できます。
// php-fpm - httpdなどのWebアプリケーション環境で起動しているタイプのデバッグモードです。
"name": "Listen for Xdebug",
// デバッグする言語のタイプを指定します。PHPの場合は"php"とします。
"type": "php",
// デバッグのリクエストタイプを指定します。"launch"はVS Codeから直接実行する場合、"attach"は外部から接続する場合です。
"request": "launch",
// Xdebugと通信するポート番号を指定します。Xdebugの設定(xdebug.remote_port = 9003)と一致させる必要があります。
"port": 9003
},
{
// 現在開いているファイル(php)をcliで起動してデバッグするモードです。
"name": "Launch currently open script",
"type": "php",
"request": "launch",
// デバッグするスクリプトファイルのパスを指定します。${file}はVS Codeで現在開いているファイルを表します。
"program": "${file}",
// デバッグするスクリプトファイルの作業ディレクトリを指定します。${fileDirname}は現在開いているファイルのディレクトリを表します。
"cwd": "${fileDirname}",
// デバッグするスクリプトファイルに渡すポート番号を指定します。0は自動的に割り当てられるポート番号を表します。
"port": 0,
// PHPに渡すコマンドライン引数を配列で指定します。ここではXdebugの起動オプションを設定しています。
// 注意:Xdebug3のオプションが指定されています。
"runtimeArgs": [
"-dxdebug.start_with_request=yes"
],
// PHPに渡す環境変数を指定します。ここではXdebugのモードとポート設定を設定しています。
// 注意:XDEBUG_MODEは、Xdebug3の環境変数です。
"env": {
"XDEBUG_MODE": "debug,develop",
// Xdebugがリッスンするポートを設定しています。
// 注意:client_portは、Xdebug3の設定です。Xdebug2では、remote_portです。
"XDEBUG_CONFIG": "client_port=${port}"
}
},
{
// ビルトインWebサーバーで起動してデバッグするモードです。
// ビルトインWebサーバーとは、PHP自身が持っているWebサーバー機能のことです。
"name": "Launch Built-in web server",
"type": "php",
"request": "launch",
// PHPに渡すコマンドライン引数を配列で指定します。ここではXdebugの起動オプションとビルトインWebサーバーの起動オプションを設定しています。
// 注意:Xdebug3のオプションが指定されています。
"runtimeArgs": [
"-dxdebug.mode=debug",
"-dxdebug.start_with_request=yes",
"-S",
// ビルトインWebサーバーが使用するホスト名とポート番号を指定します。
"localhost:0"
],
// ビルトインWebサーバーが実行するスクリプトファイルのパスを指定します。空文字列にするとインデックスファイル(index.php)が使用されます。
"program": "",
// ビルトインWebサーバーが実行するスクリプトファイルの作業ディレクトリを指定します。${workspaceRoot}は現在開いているワークスペースのルートディレクトリを表します。
"cwd": "${workspaceRoot}",
// Xdebugと通信するポート番号を指定します。
"port": 9003,
// ビルトインWebサーバーが起動したときに実行するアクションです。
// この設定により、起動したメッセージが標準出力に表示されると http://localhost:<ポート> でWebブラウザが開きます。
"serverReadyAction": {
// ビルトインWebサーバーが起動したことを示すパターンを正規表現で指定します。
// 標準出力に表示されるメッセージがこれにマッチした場合、action(Webブラウザ起動)が実行されます。
"pattern": "Development Server \\(http://localhost:([0-9]+)\\) started",
// ビルトインWebサーバーのURLのフォーマットを指定します。%sはポート番号に置き換えられます。
"uriFormat": "http://localhost:%s",
// ビルトインWebサーバーのURLをWebブラウザで開くことを指定します。
// 開くWebブラウザは、既定のブラウザです。
"action": "openExternally"
}
}
]
}
今回の記事の最終形態は、以下です。
この記事のこれ以降に、なぜそうする必要があったのかの説明があります。
{
"version": "0.2.0",
"configurations": [
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003
},
{
"name": "Launch currently open script",
"type": "php",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 9003,
"runtimeArgs": [
"-dxdebug.remote_enable=true"
],
"env": {
"XDEBUG_CONFIG": "remote_port=${port}"
}
},
{
"name": "Launch Built-in web server",
"type": "php",
"request": "launch",
"runtimeArgs": [
"-dxdebug.remote_enable=true",
"-dxdebug.remote_autostart=true",
"-S",
"localhost:3000"
],
"program": "",
"cwd": "${workspaceRoot}",
"port": 9003,
"serverReadyAction": {
"pattern": "Development Server \\(http://localhost:([0-9]+)\\) started",
"uriFormat": "http://localhost:%s/${relativeFile}",
"action": "openExternally"
}
}
]
}
Listen for Xdebug
このまま何もしなくても、"Listen for Xdebug" により、php-fpm - httpd などの PHP の Web プログラムがデバッグできます。
php-fpm - httpd の Web アプリケーション環境は、
別記事「CentOS8.3 に apache2,php,postgresql,openldap-client をインストール」で構築しています。
ここでは、/var/www/html/*.php が動作する前提とします。
2つの php プログラムを作成します。
動作内容は、以下のものとします。
http://[IPアドレス]/test.php
で起動される
↓
test.php から exec()
で other.php 起動
↓
other.php は、echo "Hello, world!";
のみ実行
↓
test.php が other.php の出力結果を受け取って、
The output of other.php is: <other.php の出力>
を echo
<?php
$other_php = "other.php";
exec("php $other_php", $output);
echo "The output of $other_php is: ".implode("\n", $output);
?>
<?php
echo "Hello, world!";
?>
xdebug.remote_autostart = true
test.php と other.php にブレークポイントを設定します。
実行とデバッグ → Listen for Xdebug を実行します。
Listen for Xdebug が選択されている状態で、F5 キーでもOKです。
停止ボタンなどが付いた小さい操作パネルが出現します。
デバッグ待機状態です。
http://[IPアドレス]/test.php
で /var/www/html/test.php へアクセスします。
ヨシ!
exec()
で other.php を起動するプログラムで試しましたが、
別記事「RHEL8 Apache2.4 PHP7:php.ini の upload_tmp_dir を変更したら SELinux 関係でハマった話」のように curl_exec()
で呼び出すタイプでも双方のブレークポイントは有効です。
以下のようなプログラムです。
Web ブラウザで、http://[IP アドレス]/post.php にアクセス
↓
post.php でダミー POST データ生成
↓
post.php で curl_exec()
により、http://localhost/receive.php
へ POST
↓
receive.php で受け取った POST データをそのまま JSON 文字列に変換
↓
receive.php で JSON 文字列をレスポンス
↓
post.php でブラウザに receive.php からのレスポンスを表示
ブレークポイントを貼って、http://[IPアドレス]/post.php
で /var/www/html/post.php へアクセスします。
post.php、receive.php 双方でブレークしました。
ヨシ!
xdebug.remote_autostart = false
xdebug.remote_autostart = true
のとき、exec()
で起動された other.php のブレークポイントも捉えています。
これは、
php-fpm で起動された test.phpexec()
で起動された other.php
双方が
php.ini(今回の場合 /etc/php.d/15-xdebug.ini)
のxdebug.remote_enable = true
xdebug.remote_autostart = true
を見ていて、どちらもデバッグが有効になっているからです。
そこで、
php.ini(今回の場合 /etc/php.d/15-xdebug.ini)
をxdebug.remote_autostart = false
にしたらどうなるか見てみます。
# vi /etc/php.d/15-xdebug.ini
xdebug.remote_autostart = true
をxdebug.remote_autostart = false
に変更します。
# systemctl restart php-fpm
デバッグ待機で、http://[IPアドレス]/test.php
で /var/www/html/test.php へアクセスします。
スルーされました!
XDEBUG_SESSION_START
パラメーターを与えて起動すると、xdebug.remote_autostart = false
でもデバッグできます。
デバッグ待機で、http://[IPアドレス]/test.php?XDEBUG_SESSION_START
で /var/www/html/test.php へアクセスします。
ヨシ!
XDEBUG_SESSION_STARTの値は指定しなくても問題ありませんでした。
逆に任意の値を入れて、
?XDEBUG_SESSION_START=1
?XDEBUG_SESSION_START=xxx
?XDEBUG_SESSION_START=PHPSTORM
でも問題ありませんでした。
しかし、exec()
で起動された other.php のブレークポイントは、止まりません。
other.php に XDEBUG_SESSION_START
のパラメータは、そこまで伝播しないからです。
以下のように -dxdebug.remote_autostart=1
オプションを付けて起動すると、デバッグ対象になりました。
【
-d
の意味 】
-d <php.ini で指定できる設定>
になります。複数指定できます。
例えば、
-d max_execution_time=20
とすると、スクリプトの最大実行時間を 20 秒に設定できます。
-d
の後のスペースは、あってもなくても良いです。
<?php
$other_php = "other.php";
exec("php -dxdebug.remote_autostart=1 $other_php", $output);
echo "The output of $other_php is: ".implode("\n", $output);
?>
これで、other.php でもブレークポイントで停止します。動画の掲載は省略します。
Launch currently open script
PHP を直接(CLI で)起動して、デバッグするモードです。
launch.json の以下の部分が使われます。
...
{
"name": "Launch currently open script",
"type": "php",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 0,
"runtimeArgs": [
"-dxdebug.start_with_request=yes"
],
"env": {
"XDEBUG_MODE": "debug,develop",
"XDEBUG_CONFIG": "client_port=${port}"
}
},
...
php.ini(今回の場合 /etc/php.d/15-xdebug.ini)に
xdebug.remote_enable = true
xdebug.remote_port = 9003
設定済みとします。
何も変えずに実行
"Launch currently open script" に切り替えて、実行してみます。
スルーされました!
...それもそのはず、
launch.json に"port": 0,
が指定されていて、"port": 9003,
を指定する必要がありました。
"port": 0,
は、ポート番号が自動的に決まり、うまくいくこともあるかもしれませんが、ここではうまくいかなかったものとします。
"port": 9003,
に変更して、もう一度実行します。
...
{
"name": "Launch currently open script",
"type": "php",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 9003,//←ここを 0 から 9003 に変更
"runtimeArgs": [
"-dxdebug.start_with_request=yes"
],
"env": {
"XDEBUG_MODE": "debug,develop",
"XDEBUG_CONFIG": "client_port=${port}"
}
},
...
ヨシ!
xdebug.remote_enable = false
ここで、
php.ini(今回の場合 /etc/php.d/15-xdebug.ini)をxdebug.remote_enable = false
とするか、コメントアウトすると、またデバッグが有効にならなくなります。
...
"runtimeArgs": [
"-dxdebug.start_with_request=yes"
],
...
runtimeArgs
部分の意味を調べると、php -dxdebug.start_with_request=yes test.php
で起動する意味になり、xdebug.start_with_request=yes
をググって調べると、「デバッグを有効にする」と書かれています。しかし、今回の場合は、有効になりません。xdebug.start_with_request=yes
は、Xdebug3 の設定だからです。(2 ではなくて、3)
VS Code は、Xdebug3 の設定を自動的に作成しています。
今回は、Xdebug2 のため、xdebug.start_with_request=yes
部分は意味がありません。xdebug.remote_autostart = true
を指定する必要があります。
また、env
の"XDEBUG_MODE": "debug,develop",
も Xdebug3 の設定のため、Xdebug2 では意味がありません。
Xdebug3 では、xdebug.remote_enable は廃止されました。代わりに、xdebug.mode を debug に設定する必要があります。
また、xdebug.remote_autostart も廃止されました。代わりに、xdebug.start_with_request を yes にセットします。
Xdebug 2 から 3 へのアップグレード(https://xdebug.org/docs/upgrade_guide/ja)
php.ini(今回の場合 /etc/php.d/15-xdebug.ini)をxdebug.remote_enable = false
にして、
launch.json の"-dxdebug.start_with_request=yes"
を"-dxdebug.remote_enable=true"
に書き換え、"XDEBUG_MODE": "debug,develop",
を削除します。
...
{
"name": "Launch currently open script",
"type": "php",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 9003,
"runtimeArgs": [
"-dxdebug.remote_enable=true"//←remote_enable=trueに変更
],
"env": {//←XDEBUG_MODE削除
"XDEBUG_CONFIG": "client_port=${port}"
}
},
...
起動します。
ヨシ!
しかし、中で起動している other.php がデバッグ対象外になります。
これは、先ほどと同じように、launch.json の runtimeArgs
に指定した-dxdebug.remote_enable=true
が伝播しないため、起動するときに指定する必要があります。
<?php
$other_php = "other.php";
exec("php -dxdebug.remote_enable=1 $other_php", $output);
echo "The output of $other_php is: ".implode("\n", $output);
?>
これで、デバッグできるようになります。
other.php でもブレークポイントで停止するようになります。動画の掲載は省略します。
xdebug.remote_port = 9000
ところで、"XDEBUG_CONFIG": "client_port=${port}"
についてですが、これも、client_port
部分が Xdebug3 の設定です。
Xdebug2 で設定している xdebug.remote_port
は Xdebug3 では、xdebug.client_port
に変わりました。
Xdebug3 では、xdebug.client_port
が設定される記述です。
${port}
は、上で指定している"port": 9003,
の値に置き換わります。
...ということは...
Xdebug2 の場合、"XDEBUG_CONFIG": "remote_port=${port}"
が正解になります。
php.ini(今回の場合 /etc/php.d/15-xdebug.ini)をxdebug.remote_port = 9000
または、;xdebug.remote_port = 9000
として、
launch.json の"XDEBUG_CONFIG": "client_port=${port}"
を"XDEBUG_CONFIG": "remote_port=${port}"
に変更すると、
php.ini(今回の場合 /etc/php.d/15-xdebug.ini)にxdebug.remote_port = 9003
を設定しなくても、9003ポートが有効になります。
...
{
"name": "Launch currently open script",
"type": "php",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 9003,
"runtimeArgs": [
"-dxdebug.remote_enable=true"//←remote_enable=trueに変更
],
"env": {//←XDEBUG_MODE削除
"XDEBUG_CONFIG": "remote_port=${port}"//remote_portに変更
}
},
...
デバッグが有効になります。動画の掲載は省略します。
Launch Built-in web server
ビルトイン Web サーバーで起動してデバッグするモードです。
ビルトイン Web サーバーとは、PHP 自身が持っている Web サーバー機能のことです。
launch.json の以下の部分が使われます。
...
{
"name": "Launch Built-in web server",
"type": "php",
"request": "launch",
"runtimeArgs": [
"-dxdebug.mode=debug",
"-dxdebug.start_with_request=yes",
"-S",
"localhost:0"
],
"program": "",
"cwd": "${workspaceRoot}",
"port": 9003,
"serverReadyAction": {
"pattern": "Development Server \\(http://localhost:([0-9]+)\\) started",
"uriFormat": "http://localhost:%s",
"action": "openExternally"
}
}
...
php.ini(今回の場合 /etc/php.d/15-xdebug.ini)に
xdebug.remote_enable = true
xdebug.remote_autostart = true
xdebug.remote_port = 9003
設定済みとします。
何も変えずに実行
"Launch Built-in web server" に切り替えて、実行してみます。
スルーされました!
しかも、Invalid address: localhost:0
とエラー出力されました!
...それもそのはず、
launch.json に"localhost:0"
が指定されていて、"localhost:3000"
を指定する必要がありました。
-S
は、ビルトイン Web サーバーを起動するオプションです。その後に、ホスト名:ポート
を指定します。3000 は、ビルトイン Web サーバーのポートです。例えば、8080 など都合の良い任意のポートを指定できますが、ここでは、3000 とします。
"localhost:3000"
に変更して、もう一度実行します。
...
{
"name": "Launch Built-in web server",
"type": "php",
"request": "launch",
"runtimeArgs": [
"-dxdebug.mode=debug",
"-dxdebug.start_with_request=yes",
"-S",
"localhost:3000"//←ここを3000に変更
],
"program": "",
"cwd": "${workspaceRoot}",
"port": 9003,
"serverReadyAction": {
"pattern": "Development Server \\(http://localhost:([0-9]+)\\) started",
"uriFormat": "http://localhost:%s",
"action": "openExternally"
}
}
...
ヨシ!...じゃなかったです。Not Found
になります。
...
"serverReadyAction": {
"pattern": "Development Server \\(http://localhost:([0-9]+)\\) started",
"uriFormat": "http://localhost:%s",
"action": "openExternally"
}
...
について、
serverReadyAction の設定により、
「Development Server (http://localhost:3000) started
」
の出力が得られたときに、自動的にブラウザが開いて、
URL欄 は、http://localhost:3000
とするようになっています。
このhttp://localhost:3000
について、パスが指定されていません。"uriFormat": "http://localhost:%s/${relativeFile}",
とパスを指定しないといけません。
index.php など
/
を起動する意図があって、指定しなくても良い場合、このままで構いません。また、手動で開く場合は、
"serverReadyAction"
自体不要になります。
${relativeFile}
は、現在開いているファイルのパスをワークスペースからの相対パスで表す変数です。例えば、/usr/workspace がワークスペース、/usr/workspace/dir/test.php を現在開いているファイルとすると、
${relativeFile}
は、dir/test.php です。
パスを指定して、起動します。
...
{
"name": "Launch Built-in web server",
"type": "php",
"request": "launch",
"runtimeArgs": [
"-dxdebug.mode=debug",
"-dxdebug.start_with_request=yes",
"-S",
"localhost:3000"//←ここを3000に変更
],
"program": "",
"cwd": "${workspaceRoot}",
"port": 9003,
"serverReadyAction": {
"pattern": "Development Server \\(http://localhost:([0-9]+)\\) started",
"uriFormat": "http://localhost:%s/${relativeFile}",//←現在開いているパスをURLに反映
"action": "openExternally"
}
}
...
ヨシ!
ブラウザで自動的に開いて、デバッグも問題無さそうです。
ビルトイン Web サーバーで起動しているため、httpd は無関係です。
# systemctl stop httpd
# systemctl stop php-fpm
としてもデバッグできます。
xdebug.remote_enable = false
php.ini(今回の場合 /etc/php.d/15-xdebug.ini)にxdebug.remote_enable = false
xdebug.remote_autostart = false
xdebug.remote_port = 9003
を設定すると、デバッグできなくなります。
"runtimeArgs": [
の"-dxdebug.mode=debug",
"-dxdebug.start_with_request=yes",
でデバッグ有効にして、起動しているように見えますが、
これは、先ほどの繰り返しになりますが、Xdebug3 のオプションが指定されています。
Xdebug2 では、別の記述にしないと有効になりません。
Xdebug3 では、xdebug.remote_enable は廃止されました。代わりに、xdebug.mode を debug に設定する必要があります。
また、xdebug.remote_autostart も廃止されました。代わりに、xdebug.start_with_request を yes にセットします。
Xdebug 2 から 3 へのアップグレード(https://xdebug.org/docs/upgrade_guide/ja)
launch.json を"-dxdebug.mode=debug",
"-dxdebug.start_with_request=yes",
から"-dxdebug.remote_enable=true",
"-dxdebug.remote_autostart=true",
に変更して、起動します。
...
{
"name": "Launch Built-in web server",
"type": "php",
"request": "launch",
"runtimeArgs": [
"-dxdebug.remote_enable=true",//←ここをremote_enableに変更
"-dxdebug.remote_autostart=true",//←ここをremote_autostartに変更
"-S",
"localhost:3000"
],
"program": "",
"cwd": "${workspaceRoot}",
"port": 9003,
"serverReadyAction": {
"pattern": "Development Server \\(http://localhost:([0-9]+)\\) started",
"uriFormat": "http://localhost:%s/${relativeFile}",
"action": "openExternally"
}
}
...
ヨシ!
しかし、中で起動している other.php がデバッグ対象外になります。
これは、先ほどと同じように、launch.json の runtimeArgs
に指定した-dxdebug.remote_enable=true
、-dxdebug.remote_autostart=true
が伝播しないため、起動するときに指定する必要があります。
<?php
$other_php = "other.php";
exec("php -dxdebug.remote_enable=1 -dxdebug.remote_autostart=1 $other_php", $output);
echo "The output of $other_php is: ".implode("\n", $output);
?>
これで、デバッグできるようになります。
other.php でもブレークポイントで停止するようになります。動画の掲載は省略します。
その他、宣伝、誹謗中傷等、当方が不適切と判断した書き込みは、理由の如何を問わず、投稿者に断りなく削除します。
書き込み内容について、一切の責任を負いません。
このコメント機能は、予告無く廃止する可能性があります。ご了承ください。
コメントの削除をご依頼の場合はTwitterのDM等でご連絡ください。