MacでPHPbrewでPHPの環境を構築していますが、Xdebugを導入しVScodeでの開発の効率を上げることにしました。設定方法をご紹介します。いくつかワナがあるのでそれをご紹介できればと思います。
もくじ
PHPインストール時の+debugでXdebugが使えるわけではない
PHPbrewの導入方法とPHPのインストール方法は以下2記事に記載しています。
これらの記事にも書きましたが、PHPのインストールのコマンドは、
1 |
$ phpbrew install 7.3.33 +default +mysql +debug +apxs2=/opt/homebrew/bin/apxs +zlib="$(brew --prefix zlib)" +openssl=/opt/homebrew/opt/openssl@1.1 -- --with-pcre-regex=$(brew --prefix pcre2) |
のようになります。
最初、ここで指定する +debug というオプションさえつけておけば、Xdebugは使えるのかと思っていました。しかし、全くそんなことはないということがわかりました。
これをつけているのに、xdebug.soなどの必要なファイルがどこにも見当たらないんですよね。もはやこのオプションが必要なのかもわかりません。当方の環境ではこのオプションをつけてここからの手順を行っております。もしかしたら、つけなくても良いのかもしれません。時間ができたらそれは検証します。
PHPbrewの作法に則ってインストール
なので、別途Xdebugをインストールします。PHPbrewのページに簡単なやり方は書いています。
Installing Extension - The Most Simple Way
インストールする前に対象のPHPにセットしておく必要があります。(当方はわけあって、最新版のPHPではなく7.3.33を使っています)
1 |
$ phpbrew switch 7.3.33 |
というのは、PHPがバージョンごとにインストールされているディレクトリ配下に拡張機能も配置されるので、どのPHPのバージョンに対してインストールするか指定する必要があるためです。
/Users/xxxxx/.phpbrew/build/php-7.3.33/ext/xdebug/
なので、複数のPHPのバージョンがあってそれぞれでXdebugを使いたいなら、それぞれに対してインストールする必要があるということです。
早速インストールしてみます。
1 |
$ phpbrew ext install xdebug |
すると
1 |
Error: Command failed: ./configure '--with-php-config=/Users/xxxxx/.phpbrew/php/php-7.3.33/bin/php-config' >> '/Users/xxxxx/.phpbrew/build/php-7.3.33/ext/xdebug/build.log' 2>&1 returns: |
と表示され、インストールできませんでした。
ここは直感でXdebugのバージョンが合ってないのかも、と思いました。以下の公式サイトを見てみると、
PHP7.3系はXdebug 3.1.6までしか対応していないことがわかりました。バージョンを指定しないと最新版をインストールしようとして失敗しているのだと推察しました。
そこで、
1 |
$ phpbrew ext install xdebug 3.1.6 |
とすると無事にインストールできました。
指定しなくても、よしなに対応しているバージョンをインストールしてくれればいいのに、と思いました。
このコマンドによって、
~/.phpbrew/php/php-7.3.33/lib/php/extensions/debug-non-zts-20180731
にxdebug.soが、
~/.phpbrew/php/php-7.3.33/var/db/
と
~/.phpbrew/php/php-7.3.33/var/db/cli/
に
xdebug.ini
が作られます。
ただ、xdebug.soの方はここで良いのですが、xdebug.iniはここにできても意味がありません。CLIを使う方以外は。
ちなみに、コマンドラインで
1 2 3 4 5 |
$ php --ini Configuration File (php.ini) Path: /Users/xxxxx/.phpbrew/php/php-7.3.33/etc/cli Loaded Configuration File: /Users/xxxxx/.phpbrew/php/php-7.3.33/etc/cli/php.ini Scan for additional .ini files in: /Users/xxxxx/.phpbrew/php/php-7.3.33/var/db/cli Additional .ini files parsed: /Users/xxxxx/.phpbrew/php/php-7.3.33/var/db/cli/xdebug.ini |
で表示されるiniファイルは、コマンドラインで適用されるiniファイルです。しかし、WordPressなどのデバッグで使いたい方は、Apacheがiniファイルを読み込むディレクトリに配置する必要があるのです。
Apacheに適用するためのiniファイルの配置
ご自身の環境の phpinfo() の出力結果を全部選択してコピーして、以下のXdebugの公式サイトに貼り付けると何をすべきか教えてくれます。
そこに、
~/.phpbrew/php/php-7.3.33/var/db/apache2/
にiniファイルを配置してください、みたいな指示があったので、あ、Apacheで使われるiniファイルのディレクトリは違うんだ、ということに気がつきました。ちなみに、 phpinfo() の表示の仕方は以下の記事に記載しています。
とはいえ、PHPbrewを使ってXdebugをインストールする方にとっては、このInstallation Wizardはあまり役に立ちません。ソースコードをダウンロードしてコンパイルする手順とかまで書いてあるので。それはPHPbrewがやってくれます。ただ、参考程度に使ってみるのはアリです。
単純にどのディレクトリにiniファイルを置けばいいか知りたいなら、 phpinfo() の出力結果から以下のように「Scan this dir for additional .ini files」の値を見ればわかります。
参考までに、ではこのディレクトリ自体は変更可能なのか調べてみました。大元のphp.iniとかで変えられるのかな、と最初思ったのですが以下によると無理です。このディレクトリはコンパイル時に決まってしまいます。コンパイル時ならオプションで指定することで変えられます。
how to allow custom built "Scan this dir for additional .ini files" php.ini file to read
ということなので、上記のディレクトリにiniファイルを配置します。ファイル名は拡張子が .ini ならなんでもいいようです。ただ、Xdebugのためのファイルとわかるように、 xdebug という文字列は入れた方がいいでしょう。
中身はそのままPHPbrewが生成したものをコピーしてきました。
つまり、
1 |
zend_extension=xdebug.so |
の一行のみでやってみました。
iniファイルに設定する項目が足りない
iniファイルを反映させるためには、Apacheの再起動が必要です。
再起動後に、 phpinfo()をまた見て、下にスクロールしていくとXdebugのセクションが出てきます。おー、ちょっと感動です。
またコピーしてInstallation Wizardに貼り付けて見ると、「You're already running the latest Xdebug version」と表示されます。
よーし、これで完了だと思ってVScodeの方でステップ実行の設定をして動かしてみました。(VScode側の設定方法は後述します)
でも、ブレーキングポイントで止まりません。あれ、なんでだ?
調べた結果、iniファイルに追記する必要がありました。2、3行目を追記しています。
1 2 3 |
zend_extension=xdebug.so xdebug.mode=debug xdebug.start_with_request=yes |
以下の記事を参考にしました。
visual studio code PHP debugging not working
phpinfo()のXdebugのセクションにも、上記の項目が反映されました。
これでちゃんとブレーキングポイントで止まるようになりました。
なお、当記事ではXdebugのバージョンが3.1.6を使っていますが、2系と3系ではオプションが変わってシンプルな記載で済むようになっています。
ネット上にはまだ2系のオプションのままの記事が多いので、知らないとハマるかもしれません。
ちなみに、ここで作成したiniファイルは、PHPbrewで別のバージョンのPHPをインストールした場合、そのバージョンでもそのまま使えます。コピーして、対象のバージョンのディレクトリに配置します。それについては以下で説明しています。
VScodeでの設定
VScodeでの設定は基本的に以下の記事のやり方で大丈夫です。
【PHP】Xdebug & VS Codeによるステップ実行
launch.jsonを作成する必要がありますが、内容は最初に生成されるままで大丈夫でした。内容を修正する必要はありませんでした。