Xdebug と VSCode で PHP をステップ実行する

PHP

本記事では、Xdebug と VSCode を使用して PHP のデバッグ環境を用意する方法について説明しています。

Xdebug を利用することで、ステップ実行でのデバッグを行えるようになります。
導入に少し手間がかかりますが、作業効率がかなり向上しますので、ぜひお試しください!

環境情報

本記事では、以下バージョンにてインストールを行った結果を掲載しています。

【サーバ側】
・OS:CentOS Stream 9
・Apache:2.4
・PHP:8.3
・Xdebug:3.3

【クライアント側】
OS:Windows 10
VSCode:1.92

イメージ図は以下の通りです。
黄色背景の部分が本手順でインストールする内容です。

※注意※
イメージ図の通り本手順では PHP の稼働しているサーバに Xdebug、VSCode server をインストールします。
サーバのリソースを消費しますので、導入する環境に応じたレベルの影響確認を実施されると良いかと思います。

クライアント PC の Windows10 上の VSCode の拡張機能 Remote – SSH を使いサーバに SSH 接続を行います。
そうすることで、サーバ上のソースコードをあたかもクライアント側の Windows10 の VSCode で操作しているようになります。

ステップ実行のデバッグ処理は、サーバ上の VSCode server と Xdebug との間で行われます。
イメージ図内に [ポイント] として記載していますが、その際対象の PHP ソースファイルはサーバ上のものとなります。

それではインストールしていきましょう!

Xdebug インストール

1.前提確認

はじめに PHP が稼働していることを確認しておきます。

Bash
php -v
# [check] => バージョンが表示されること
実行結果
[root@localhost ~]# php -v
PHP 8.3.10 (cli) (built: Jul 30 2024 13:44:37) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.3.10, Copyright (c) Zend Technologies
[root@localhost ~]# # [check] => バージョンが表示されること

PHP環境を未作成の場合は、こちらの記事を参考にご準備いただければと思います。

ブラウザ経由でも動作を確認しておきます。

ドキュメントルート配下に index.php を作成して下記コードを記載しておきます。

<?php
phpinfo();

ブラウザで http://192.168.56.88/index.php にアクセスし phpinfo の情報が見れることを確認しておきます。

2.Xdebug のインストール

事前に Xdebug のインストールに必要なパッケージのインストールをしておきます。

Bash
dnf info php-devel php-pear         # インストール内容の確認
dnf install -y php-devel php-pear   # インストール
実行結果
[root@localhost ~]# dnf info php-devel php-pear         # インストール内容の確認
メタデータの期限切れの最終確認: 0:00:32 前の 2024年08月28日 21時50分43秒 に実施しました。
利用可能なパッケージ
名前         : php-devel
バージョン   : 8.3.11
リリース     : 1.el9.remi
Arch         : x86_64
サイズ       : 777 k
ソース       : php-8.3.11-1.el9.remi.src.rpm
リポジトリー : remi-modular
概要         : Files needed for building PHP extensions
URL          : http://www.php.net/
ライセンス   : PHP-3.01 AND Zend-2.0 AND BSD-2-Clause AND MIT AND Apache-1.0 AND NCSA AND BSL-1.0
説明         : The php-devel package contains the files needed for building PHP
             : extensions. If you need to compile your own PHP extensions, you will
             : need to install this package.

名前         : php-pear
エポック     : 1
バージョン   : 1.10.14
リリース     : 1.el9
Arch         : noarch
サイズ       : 356 k
ソース       : php-pear-1.10.14-1.el9.src.rpm
リポジトリー : appstream
概要         : PHP Extension and Application Repository framework
URL          : http://pear.php.net/package/PEAR
ライセンス   : BSD-2-Clause AND BSD-3-Clause AND LGPL-3.0-or-later
説明         : PEAR is a framework and distribution system for reusable PHP
             : components.  This package contains the basic PEAR components.

[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# dnf install -y php-devel php-pear   # インストール
メタデータの期限切れの最終確認: 0:00:40 前の 2024年08月28日 21時50分43秒 に実施しました。
依存関係が解決しました。
======================================================================================================================================
 パッケージ                             アーキテクチャー       バージョン                          リポジトリー                 サイズ
======================================================================================================================================
インストール:
 php-devel                              x86_64                 8.3.11-1.el9.remi                   remi-modular                 777 k
 php-pear                               noarch                 1:1.10.14-1.el9                     appstream                    356 k

<<<<<<<<<<<<<<< 省略 >>>>>>>>>>>>>>>

インストール済み:
  autoconf-2.69-39.el9.noarch                  automake-1.16.2-8.el9.noarch             cmake-filesystem-3.26.5-2.el9.x86_64
  cpp-11.4.1-3.el9.x86_64                      emacs-filesystem-1:27.2-9.el9.noarch     gcc-11.4.1-3.el9.x86_64
  gcc-c++-11.4.1-3.el9.x86_64                  glibc-devel-2.34-117.el9.x86_64          glibc-headers-2.34-117.el9.x86_64
  kernel-headers-5.14.0-496.el9.x86_64         keyutils-libs-devel-1.6.3-1.el9.x86_64   krb5-devel-1.21.1-3.el9.x86_64
  libcom_err-devel-1.46.5-5.el9.x86_64         libkadm5-1.21.1-3.el9.x86_64             libmpc-1.2.1-4.el9.x86_64
  libpkgconf-1.7.3-10.el9.x86_64               libselinux-devel-3.6-1.el9.x86_64        libsepol-devel-3.6-1.el9.x86_64
  libstdc++-devel-11.4.1-3.el9.x86_64          libtool-2.4.6-46.el9.x86_64              libverto-devel-0.3.2-3.el9.x86_64
  libxcrypt-devel-4.4.18-3.el9.x86_64          libxml2-devel-2.9.13-6.el9.x86_64        m4-1.4.19-1.el9.x86_64
  make-1:4.3-8.el9.x86_64                      openssl-devel-1:3.2.2-2.el9.x86_64       pcre2-devel-10.40-5.el9.x86_64
  pcre2-utf16-10.40-5.el9.x86_64               pcre2-utf32-10.40-5.el9.x86_64           perl-AutoLoader-5.74-481.el9.noarch
  perl-B-1.80-481.el9.x86_64                   perl-Carp-1.50-460.el9.noarch            perl-Class-Struct-0.66-481.el9.noarch
  perl-Data-Dumper-2.174-462.el9.x86_64        perl-Digest-1.19-4.el9.noarch            perl-Digest-MD5-2.58-4.el9.x86_64
  perl-DynaLoader-1.47-481.el9.x86_64          perl-Encode-4:3.08-462.el9.x86_64        perl-Errno-1.30-481.el9.x86_64
  perl-Exporter-5.74-461.el9.noarch            perl-Fcntl-1.13-481.el9.x86_64           perl-File-Basename-2.85-481.el9.noarch
  perl-File-Compare-1.100.600-481.el9.noarch   perl-File-Copy-2.34-481.el9.noarch       perl-File-Find-1.37-481.el9.noarch
  perl-File-Path-2.18-4.el9.noarch             perl-File-Temp-1:0.231.100-4.el9.noarch  perl-File-stat-1.09-481.el9.noarch
  perl-FileHandle-2.03-481.el9.noarch          perl-Getopt-Long-1:2.52-4.el9.noarch     perl-Getopt-Std-1.12-481.el9.noarch
  perl-HTTP-Tiny-0.076-462.el9.noarch          perl-IO-1.43-481.el9.x86_64              perl-IO-Socket-IP-0.41-5.el9.noarch
  perl-IO-Socket-SSL-2.073-2.el9.noarch        perl-IPC-Open3-1.21-481.el9.noarch       perl-MIME-Base64-3.16-4.el9.x86_64
  perl-Mozilla-CA-20200520-6.el9.noarch        perl-NDBM_File-1.15-481.el9.x86_64       perl-Net-SSLeay-1.94-1.el9.x86_64
  perl-POSIX-1.94-481.el9.x86_64               perl-PathTools-3.78-461.el9.x86_64       perl-Pod-Escapes-1:1.07-460.el9.noarch
  perl-Pod-Perldoc-3.28.01-461.el9.noarch      perl-Pod-Simple-1:3.42-4.el9.noarch      perl-Pod-Usage-4:2.01-4.el9.noarch
  perl-Scalar-List-Utils-4:1.56-462.el9.x86_64 perl-SelectSaver-1.02-481.el9.noarch     perl-Socket-4:2.031-4.el9.x86_64
  perl-Storable-1:3.21-460.el9.x86_64          perl-Symbol-1.08-481.el9.noarch          perl-Term-ANSIColor-5.01-461.el9.noarch
  perl-Term-Cap-1.17-460.el9.noarch            perl-Text-ParseWords-3.30-460.el9.noarch perl-Text-Tabs+Wrap-2013.0523-460.el9.noarch
  perl-Thread-Queue-3.14-460.el9.noarch        perl-Time-Local-2:1.300-7.el9.noarch     perl-URI-5.09-3.el9.noarch
  perl-base-2.27-481.el9.noarch                perl-constant-1.33-461.el9.noarch        perl-if-0.60.800-481.el9.noarch
  perl-interpreter-4:5.32.1-481.el9.x86_64     perl-libnet-3.13-4.el9.noarch            perl-libs-4:5.32.1-481.el9.x86_64
  perl-mro-1.23-481.el9.x86_64                 perl-overload-1.31-481.el9.noarch        perl-overloading-0.02-481.el9.noarch
  perl-parent-1:0.238-460.el9.noarch           perl-podlators-1:4.14-460.el9.noarch     perl-subs-1.03-481.el9.noarch
  perl-threads-1:2.25-460.el9.x86_64           perl-threads-shared-1.61-460.el9.x86_64  perl-vars-1.05-481.el9.noarch
  php-devel-8.3.11-1.el9.remi.x86_64           php-fedora-autoloader-1.0.1-7.el9.noarch php-nikic-php-parser5-5.1.0-1.el9.noarch
  php-pear-1:1.10.14-1.el9.noarch              php-process-8.3.11-1.el9.remi.x86_64     pkgconf-1.7.3-10.el9.x86_64
  pkgconf-m4-1.7.3-10.el9.noarch               pkgconf-pkg-config-1.7.3-10.el9.x86_64   tar-2:1.34-6.el9.x86_64
  xz-devel-5.2.5-8.el9.x86_64                  zlib-devel-1.2.11-41.el9.x86_64

完了しました!
[root@localhost ~]#

Xdebug をインストールします。

Bash
pecl install xdebug                 # インストール
# Build process completed successfully と出力されていればOK
実行結果
[root@localhost ~]# pecl install xdebug                 # インストール
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
downloading xdebug-3.3.2.tgz ...
Starting to download xdebug-3.3.2.tgz (258,943 bytes)
.....................................................done: 258,943 bytes
102 source files, building
running: phpize
Configuring for:
PHP Version:             8.3
PHP Api Version:         20230831
Zend Module Api No:      20230831
Zend Extension Api No:   420230831
building in /var/tmp/pear-build-rootN9PWAJ/xdebug-3.3.2
running: /var/tmp/xdebug/configure --with-php-config=/usr/bin/php-config

<<<<<<<<<<<<<<< 省略 >>>>>>>>>>>>>>>

Build process completed successfully
Installing '/usr/lib64/php/modules/xdebug.so'
install ok: channel://pecl.php.net/xdebug-3.3.2
configuration option "php_ini" is not set to php.ini location
You should add "zend_extension=/usr/lib64/php/modules/xdebug.so" to php.ini
[root@localhost ~]# # Build process completed successfully と出力されていればOK

実行結果の 22 行目に「You should add “zend_extension=/usr/lib64/php/modules/xdebug.so” to php.ini」と記載があるので、php.ini に追記します。

3.php.ini の設定

php.ini のファイル所在を確認します。

Bash
php -i | grep php.ini   # php.ini のファイル所在確認
実行結果
[root@localhost ~]# php -i | grep php.ini   # php.ini のファイル所在確認
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini
[root@localhost ~]#

/etc/php.ini にあると確認できたので編集していきます。

Bash
cp -p /etc/php.ini /etc/php.ini.org     # バックアップ
vi /etc/php.ini                         # 編集

以下を php.ini ファイルの末尾に追加します。

[xdebug]
zend_extension=/usr/lib64/php/modules/xdebug.so

バックアップと比較して変更箇所を確認します。

Bash
diff /etc/php.ini.org /etc/php.ini      # 追記内容確認
実行結果
[root@localhost ~]# diff /etc/php.ini.org /etc/php.ini      # 追記内容確認
1668a1669,1670
> [xdebug]
> zend_extension=/usr/lib64/php/modules/xdebug.so
[root@localhost ~]#

php.ini の設定が完了したので、サービスを再起動します。

Bash
systemctl restart php-fpm
systemctl restart httpd

4.インストール結果確認

php -v の表示内容を確認します。

Bash
php -v
# [check] => with Xdebug v3.x.x と表示されていること
実行結果
[root@localhost ~]# php -v
PHP 8.3.11 (cli) (built: Aug 27 2024 19:16:34) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.3.11, Copyright (c) Zend Technologies
    with Xdebug v3.3.2, Copyright (c) 2002-2024, by Derick Rethans
[root@localhost ~]#

実行結果の 5 行目に「with Xdebug v3.3.2」と表示されていることを確認できました。

php -i の結果に xdebug の内容があるか確認します。

Bash
php -i | grep xdebug
# [check] => xdebug 関連の設置値が表示されていること
実行結果
[root@localhost ~]# php -i | grep xdebug
xdebug
Support Xdebug on Patreon, GitHub, or as a business: https://xdebug.org/support
             Enabled Features (through 'xdebug.mode' setting)
'xdebug://gateway' pseudo-host support => yes
'xdebug://nameserver' pseudo-host support => yes
xdebug.auto_trace => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.cli_color => 0 => 0
xdebug.client_discovery_header => HTTP_X_FORWARDED_FOR,REMOTE_ADDR => HTTP_X_FORWARDED_FOR,REMOTE_ADDR
xdebug.client_host => localhost => localhost
xdebug.client_port => 9003 => 9003
xdebug.cloud_id => no value => no value
xdebug.collect_assignments => Off => Off
xdebug.collect_includes => (setting removed in Xdebug 3) => (setting removed in Xdebug 3)
xdebug.collect_params => On => On
xdebug.collect_return => Off => Off
xdebug.collect_vars => (setting removed in Xdebug 3) => (setting removed in Xdebug 3)
xdebug.connect_timeout_ms => 200 => 200
xdebug.control_socket => time: 25ms => time: 25ms
xdebug.coverage_enable => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.default_enable => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.discover_client_host => Off => Off
xdebug.dump.COOKIE => no value => no value
xdebug.dump.ENV => no value => no value
xdebug.dump.FILES => no value => no value
xdebug.dump.GET => no value => no value
xdebug.dump.POST => no value => no value
xdebug.dump.REQUEST => no value => no value
xdebug.dump.SERVER => no value => no value
xdebug.dump.SESSION => no value => no value
xdebug.dump_globals => On => On
xdebug.dump_once => On => On
xdebug.dump_undefined => Off => Off
xdebug.file_link_format => no value => no value
xdebug.filename_format => no value => no value
xdebug.force_display_errors => Off => Off
xdebug.force_error_reporting => 0 => 0
xdebug.gc_stats_enable => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.gc_stats_output_dir => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.gc_stats_output_name => gcstats.%p => gcstats.%p
xdebug.halt_level => 0 => 0
xdebug.idekey => no value => no value
xdebug.log => no value => no value
xdebug.log_level => 7 => 7
xdebug.max_nesting_level => 512 => 512
xdebug.max_stack_frames => -1 => -1
xdebug.mode => develop => develop
xdebug.output_dir => /tmp => /tmp
xdebug.overload_var_dump => (setting removed in Xdebug 3) => (setting removed in Xdebug 3)
xdebug.profiler_append => Off => Off
xdebug.profiler_enable => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.profiler_enable_trigger => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.profiler_enable_trigger_value => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.profiler_output_dir => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.profiler_output_name => cachegrind.out.%p => cachegrind.out.%p
xdebug.remote_autostart => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.remote_connect_back => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.remote_enable => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.remote_host => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.remote_log => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.remote_log_level => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.remote_mode => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.remote_port => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.remote_timeout => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.scream => Off => Off
xdebug.show_error_trace => Off => Off
xdebug.show_exception_trace => Off => Off
xdebug.show_local_vars => Off => Off
xdebug.show_mem_delta => (setting removed in Xdebug 3) => (setting removed in Xdebug 3)
xdebug.start_upon_error => default => default
xdebug.start_with_request => default => default
xdebug.trace_enable_trigger => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.trace_enable_trigger_value => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.trace_format => 0 => 0
xdebug.trace_options => 0 => 0
xdebug.trace_output_dir => (setting renamed in Xdebug 3) => (setting renamed in Xdebug 3)
xdebug.trace_output_name => trace.%c => trace.%c
xdebug.trigger_value => no value => no value
xdebug.use_compression => 1 => 1
xdebug.var_display_max_children => 128 => 128
xdebug.var_display_max_data => 512 => 512
xdebug.var_display_max_depth => 3 => 3
[root@localhost ~]#

設定値が出てきたので、インストールされているようです。

ブラウザからも確認してみます。

下にスクロールすると xdebug の設定を確認できました。

ちなみに、phpinfo(); ではなく xdebug_info(); でも同様の結果をWeb上で確認できます。
xdebug_info では、xdebug.xxxxx の設定値のドキュメントリンクが表示されるので、便利です。

Xdebug のインストールは問題なく行えたようです。

5.ステップ実行用の設定追加

ステップ実行用の Xdebug の設定を追加します。

php.ini の先ほど追加した 1,2 行目の後に、3,4,5 行目の内容を追加します。

[xdebug]
zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.mode = develop,debug
xdebug.start_with_request = yes
xdebug.force_display_errors = 1

3,4行目の設定がステップ実行用の設定です。

以下の点は、ステップ実行に関係ないので、お好みで設定ください。
 ・5行目は、エラー発生時に画面にエラー内容を強制的に表示する
 ・3行目の develop を指定すると var_dump() の出力内容が見やすくなる

バックアップと比較して変更箇所を確認します。

Bash
diff /etc/php.ini.org /etc/php.ini      # 追記内容確認
実行結果
[root@localhost html]# diff /etc/php.ini.org /etc/php.ini      # 追記内容確認
1668a1669,1673
> [xdebug]
> zend_extension=/usr/lib64/php/modules/xdebug.so
> xdebug.mode = develop,debug
> xdebug.start_with_request = yes
> xdebug.force_display_errors = 1
[root@localhost html]#

php.ini の設定が完了したので、サービスを再起動します。

Bash
systemctl restart php-fpm
systemctl restart httpd

VSCode の拡張機能 Remote – SSH をインストール

本手順は 別記事 にしているのでそちらを参照ください。

VS Code server に拡張機能 PHP Debug をインストール

上記手順でサーバ環境に SSH で接続した状態で、サーバ上の VS Code(VC Code server)に拡張機能 PHP Debug をインストールしていきます。

インストール前は SSH 接続先の環境には、何もインストールされていないことが確認できます。

PHP Debug を検索してインストールします。

インストール後に SSH 接続している環境の INSTALLED 欄に PHP Debug が表示されていることを確認します。

デバッグの設定ファイル作成

ステップ実行デバッグをするための設定ファイルを作成していきます。

リモート接続した状態で、Run => Add Configuration をクリックします。

PHP を選択します。

.vscode/launch.json が自動生成されるので、以下内容を記載して保存します。

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9003
        }
    ]
}

SELinux 対策

ここまできたら必要なソフトウェアのインストールは完了ですが、SE Linux が有効な環境ではこのままではステップ実行ができない可能性がありますので対策をしていきます。
※SE Linux が無効もしくは導入されていないシステムの場合は本手順は不要です。

まずは、実際にステップ実行を試してみます。

①VS Code で Run And Debug 画面を開きます。
②test.php の 3行目にブレイクポイントを設定します。
③launch.json の name に設定した名前を選択した状態で ▶ を押しデバッグを開始します。
④Webブラウザから test.php にアクセスします。

ブレイクポイントを設定した 3 行目で処理が止まる想定でしたが、画面上に 3行目と5行目の var_dump()の内容が出力されてしまいました。
ステップ実行が機能していないようです。

xdebug ではステップ実行時にクライアントのポート9003に対して通信を行いますが、SELinux が導入されている環境では、その通信が拒否されていることが原因と思われます。
※ここでクライアントとは今回の構成では VSCode server のことを指しています。

監査ログを確認してみます。
※audit.log ファイルが見つからない場合は /var/log/messages ファイルを確認してみてください。

Bash
tail -3 /var/log/audit/audit.log
実行結果
[root@localhost audit]# tail -3 /var/log/audot/audit.log
tail: '/var/log/audot/audit.log'  読み込み用に開くことが出来ません: そのようなファイルやディレクトリはありません
[root@localhost audit]# tail -3 /var/log/audit/audit.log
type=AVC msg=audit(1725174474.346:550): avc:  denied  { name_connect } for  pid=772 comm="php-fpm" dest=9003 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=0
type=SYSCALL msg=audit(1725174474.346:550): arch=c000003e syscall=42 success=no exit=-13 a0=7 a1=5638b3c6fff0 a2=10 a3=7fb63c7b841b items=0 ppid=737 pid=772 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="php-fpm" exe="/usr/sbin/php-fpm" subj=system_u:system_r:httpd_t:s0 key=(null)ARCH=x86_64 SYSCALL=connect AUID="unset" UID="apache" GID="apache" EUID="apache" SUID="apache" FSUID="apache" EGID="apache" SGID="apache" FSGID="apache"
type=PROCTITLE msg=audit(1725174474.346:550): proctitle=7068702D66706D3A20706F6F6C20777777
[root@localhost audit]#

実行結果の 4 行目で以下の出力があり、9003 で拒否されていることがわかります。

type=AVC msg=audit(1725174474.346:550): avc: denied { name_connect } for pid=772 comm=”php-fpm” dest=9003 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:unreserved_port_t:s0 tclass=tcp_socket permissive=0

SELinux の設定を変更していきます。

まずは SE Linux の設定に必要なパッケージをインストールしていきます。(導入済みの方は飛ばして下さい)

Bash
dnf info setroubleshoot-server          # SELinux 設定用のパッケージ(確認)
dnf install -y setroubleshoot-server    # SELinux 設定用のパッケージ(インストール) 
実行結果
[root@localhost audit]# dnf info setroubleshoot-server          # SELinux 設定用のパッケージ(確認)
利用可能なパッケージ
名前         : setroubleshoot-server
バージョン   : 3.3.32
リリース     : 1.el9
Arch         : x86_64
サイズ       : 324 k
ソース       : setroubleshoot-3.3.32-1.el9.src.rpm
リポジトリー : appstream
概要         : SELinux troubleshoot server
URL          : https://gitlab.com/setroubleshoot/setroubleshoot
ライセンス   : GPL-2.0-or-later
説明         : Provides tools to help diagnose SELinux problems. When AVC messages
             : are generated an alert can be generated that will give information
             : about the problem and help track its resolution. Alerts can be configured
             : to user preference. The same tools can be run on existing log files.

[root@localhost audit]#
[root@localhost audit]#
[root@localhost audit]# dnf install -y setroubleshoot-server    # SELinux 設定用のパッケージ(インストール)
依存関係が解決しました。
=====================================================================================================================
 パッケージ                               アーキテクチャー   バージョン                  リポジトリー          サイズ
=====================================================================================================================
インストール:
 setroubleshoot-server                    x86_64             3.3.32-1.el9                appstream             324 k
依存関係のインストール:

<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 省略 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>

インストール済み:
  checkpolicy-3.6-1.el9.x86_64                           policycoreutils-python-utils-3.6-2.1.el9.noarch
  polkit-0.117-13.el9.x86_64                             polkit-libs-0.117-13.el9.x86_64
  polkit-pkla-compat-0.1-21.el9.x86_64                   python3-audit-3.1.5-1.el9.x86_64
  python3-dasbus-1.4-5.el9.noarch                        python3-distro-1.5.0-7.el9.noarch
  python3-libsemanage-3.6-2.el9.x86_64                   python3-libxml2-2.9.13-6.el9.x86_64
  python3-policycoreutils-3.6-2.1.el9.noarch             python3-setools-4.4.4-1.el9.x86_64
  python3-setuptools-53.0.0-13.el9.noarch                setroubleshoot-plugins-3.3.14-4.el9.noarch
  setroubleshoot-server-3.3.32-1.el9.x86_64

完了しました!
[root@localhost audit]#

HTTPモジュール(今回は php-fpm)からリモートポートへ接続できるように設定を変更します。

Bash
setsebool -P httpd_can_network_connect on

設定は以上です。
これでステップ実行ができるはずです。

ステップ実行デバッグを試す

以下の手順でデバッグを実行します。

①VS Code で Run And Debug 画面を開きます。
②test.php の 3行目にブレイクポイントを設定します。
③launch.json の name に設定した名前を選択した状態で ▶ を押しデバッグを開始します。
④Webブラウザから test.php にアクセスします。

VS Code 上で3行目で処理が止まり、ブラウザもタブがぐるぐるしているので、レスポンス待ち(サーバ側で処理中)ということが確認できます。
また、VS Code の画面左側には、変数の値が確認できます。

この後は、ステップイン・ステップオーバー等を行いデバッグをしていきます。

まとめ

本記事では、サーバ上で稼働しているPHPシステムを想定して、ステップ実行のできる設定を行いました。

ローカル上で稼働している PHP システムを利用して xdebug でステップ実行を行う方法と比べると設定箇所が多いですが、本番環境と近い構成の開発サーバに対してステップ実行でデバッグを行いたい時などに活用できるかと思います。

最後までお読みいただきありがとうございました。