1. 記事一覧 >
  2. ブログ記事
category logo

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」拡張機能をインストールします。

「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 左下部分をクリックして、リモート接続します。

リモート接続1


リモート接続2


リモート接続3


リモート接続4


リモート接続5


リモート接続6


リモート接続7


リモート接続8


リモート接続9


リモート接続10


PHP Debug 拡張機能追加

「PHP Debug」拡張機能(作者:Xdebug)を追加します。

「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 ファイルを作成します


launch.json が自動生成されます。

launch.json


.vscode フォルダも作成されて、今回の場合、.vscode/launch.json に作成されています。

.vscode/launch.json


内容は、以下です。
注意:コメントで意味を追記しています。コメントのところは、実際と異なりますが、設定内容は実際の作成直後と同じです。

.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"
            }
        }
    ]
}

今回の記事の最終形態は、以下です。
この記事のこれ以降に、なぜそうする必要があったのかの説明があります。

.vscode/launch.json
{
    "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

test.php
<?php
$other_php = "other.php";
exec("php $other_php", $output);
echo "The output of $other_php is: ".implode("\n", $output);
?>
other.php
<?php
echo "Hello, world!";
?>

php作成


xdebug.remote_autostart = true

test.php と other.php にブレークポイントを設定します。

test.phpのブレークポイント


other.phpのブレークポイント


実行とデバッグListen for Xdebug を実行します。

Listen for Xdebug が選択されている状態で、F5 キーでもOKです。

Listen for Xdebug実行


停止ボタンなどが付いた小さい操作パネルが出現します。
デバッグ待機状態です。


http://[IPアドレス]/test.php で /var/www/html/test.php へアクセスします。

Listen for Xdebug 動画


ヨシ!


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 からのレスポンスを表示

curl_execプログラム


ブレークポイントを貼って、http://[IPアドレス]/post.php で /var/www/html/post.php へアクセスします。

Listen for Xdebug post.php デバッグ動画


post.php、receive.php 双方でブレークしました。
ヨシ!


xdebug.remote_autostart = false

xdebug.remote_autostart = true のとき、
exec() で起動された other.php のブレークポイントも捉えています。
これは、
php-fpm で起動された test.php
exec() で起動された 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 へアクセスします。

Listen for Xdebug xdebug.remote_autostart = false 動画


スルーされました!


XDEBUG_SESSION_START パラメーターを与えて起動すると、xdebug.remote_autostart = false でもデバッグできます。
デバッグ待機で、http://[IPアドレス]/test.php?XDEBUG_SESSION_START で /var/www/html/test.php へアクセスします。

Listen for Xdebug xdebug.remote_autostart = false XDEBUG_SESSION_START 動画


ヨシ!


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 の後のスペースは、あってもなくても良いです。

test.php
<?php
$other_php = "other.php";
exec("php -dxdebug.remote_autostart=1 $other_php", $output);
echo "The output of $other_php is: ".implode("\n", $output);
?>

-dxdebug.remote_autostart=1オプションを付けて起動

これで、other.php でもブレークポイントで停止します。動画の掲載は省略します。


Launch currently open script

PHP を直接(CLI で)起動して、デバッグするモードです。


launch.json の以下の部分が使われます。

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 currently open script 動画


スルーされました!


...それもそのはず、


launch.json に
"port": 0,
が指定されていて、
"port": 9003,
を指定する必要がありました。

"port": 0, は、ポート番号が自動的に決まり、うまくいくこともあるかもしれませんが、ここではうまくいかなかったものとします。


"port": 9003,
に変更して、もう一度実行します。

launch.json該当部分
...
        {
            "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}"
            }
        },
...

Launch currently open script port 9003 動画


ヨシ!


xdebug.remote_enable = false

ここで、
php.ini(今回の場合 /etc/php.d/15-xdebug.ini)を
xdebug.remote_enable = false
とするか、コメントアウトすると、またデバッグが有効にならなくなります。

launch.json
...
            "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",
を削除します。

launch.json該当部分
...
        {
            "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}"
            }
        },
...

起動します。

Launch currently open script -dxdebug.remote_enable=true 動画


ヨシ!


しかし、中で起動している other.php がデバッグ対象外になります。
これは、先ほどと同じように、launch.json の runtimeArgs に指定した
-dxdebug.remote_enable=true が伝播しないため、起動するときに指定する必要があります。

test.php
<?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ポートが有効になります。

launch.json該当部分
...
        {
            "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 の以下の部分が使われます。

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" に切り替えて、実行してみます。

Launch Built-in web server 動画


スルーされました!


しかも、
Invalid address: localhost:0
とエラー出力されました!


...それもそのはず、
launch.json に
"localhost:0"
が指定されていて、
"localhost:3000"
を指定する必要がありました。

-S は、ビルトイン Web サーバーを起動するオプションです。その後に、ホスト名:ポート を指定します。

3000 は、ビルトイン Web サーバーのポートです。例えば、8080 など都合の良い任意のポートを指定できますが、ここでは、3000 とします。


"localhost:3000" に変更して、もう一度実行します。

launch.json該当部分
...
        {
            "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"
            }
        }
...

Launch Built-in web server ポート3000 動画


ヨシ!...じゃなかったです。
Not Found になります。


launch.json該当部分
...
            "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 です。


パスを指定して、起動します。

launch.json該当部分
...
        {
            "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"
            }
        }
...

Launch Built-in web server パスを指定 動画


ヨシ!
ブラウザで自動的に開いて、デバッグも問題無さそうです。

ビルトイン 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
を設定すると、デバッグできなくなります。

Launch Built-in web server xdebug.remote_enable = false 動画


"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",
に変更して、起動します。

launch.json該当部分
...
        {
            "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"
            }
        }
...

Launch Built-in web server runtimeArgs変更 動画


ヨシ!


しかし、中で起動している other.php がデバッグ対象外になります。
これは、先ほどと同じように、launch.json の runtimeArgs に指定した
-dxdebug.remote_enable=true-dxdebug.remote_autostart=true が伝播しないため、起動するときに指定する必要があります。

test.php
<?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 でもブレークポイントで停止するようになります。動画の掲載は省略します。


loading...