macOS ローカルPCのPHP CLIをxdebugするには

今回の記事は、ローカルPCのPHP CLIで実行して、ローカルPCのPhpStormでデバグするための設定です。

状況

あるWebアプリケーションのプロジェクトがあって、docker-composeで動いています。ローカルPCのブラウザから http://localhost:1234/ として表示します。このwebアプリは、docker内のPHPで動いています。

別プロジェクトとして、E2Eテストがあります。puppeteerとPuPHPeteer、phpunitで作っています。ローカルPCのターミナルで(dockerに入ることなく)、phpunitを実行します。このphpunitは、ローカルPCのPHP CLIで動いています。

E2Eテストのphpunitを実行すると、ローカルPCのChromeが開き、自動実行されます。1つのテストケースの実行に1〜2分、テストケースは50近くあるので、1時間半ぐらいかかります。

Ubuntu 18では、オールグリーンなのですが、macOSでは、HTMLエレメントが見つからないエラーでテストを通りません。(エラーはmacOSとは関係ない原因でした)

何が原因か調べるために、macOSのPhpStormで、E2Eテストのプロジェクトを開き、HTMLエレメントが見つからない箇所にブレークポイントを設定し、デバグ実行しました。

ところが、ブレークポイントで止まりません!(Ubuntu 18では、ブレークポイントで止まります)

PhpStormのバージョンは、2020.3.2 です。

PHPとxdebugのインストール

PHPのインストール

homebrewでPHP 7.2をインストールします。

$ brew install php@7.2Code language: Bash (bash)

バージョンと場所を確認します。

$ php -v
PHP 7.2.34 (cli) (built: Feb 27 2021 17:44:53) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.34, Copyright (c) 1999-2018, by Zend Technologies

$ which php
/usr/local/opt/php@7.2/bin/phpCode language: Bash (bash)

php.iniは、/usr/local/etc/php/7.2/php.ini にありました。

peclコマンドもインストールされているはずです。バージョンと場所を確認します。

$ pecl version
PEAR Version: 1.10.12
PHP Version: 7.2.34
Zend Engine Version: 3.2.0
Running on: Darwin MacBookPro-2016.local 20.3.0 Darwin Kernel Version 20.3.0: Thu Jan 21 00:07:06 PST 2021; root:xnu-7195.81.3~1/RELEASE_X86_64 x86_64

$ which pecl
PHP 7.2.34 (cli) (built: Feb 27 2021 17:44:53) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.34, Copyright (c) 1999-2018, by Zend Technologies

$ which pecl
/usr/local/opt/php@7.2/bin/pecl
Code language: Bash (bash)

xdebugのインストール

次に、peclコマンドでxdebugをインストールします。

$ pecl install xdebug
Code language: Bash (bash)

無事インストールされると、php -vにxdebugが表示されるようになります。

$ php -v
PHP 7.2.34 (cli) (built: Feb 27 2021 17:44:53) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.34, Copyright (c) 1999-2018, by Zend Technologies
    with Xdebug v3.0.3, Copyright (c) 2002-2021, by Derick Rethans

Code language: Bash (bash)

ねんのため、xdebug.soの場所を調べてみると、
/usr/local/Cellar/php@7.2/7.2.34_2/pecl/20170718/xdebug.so
でした。

php.iniの編集

そして、php.ini に xdebugの設定をします。php.iniは、/usr/local/etc/php/7.2/php.ini にありました。

さきほどのpeclコマンドでxdebugをインストールしたとき、自動でphp.ini の先頭行に zend_extension=xdebug.so が挿入されていました。別ファイルで設定したいので、php.iniから削除します。

zend_extension=xdebug.so
[PHP]

;;;;;;;;;;;;;;;;;;;
; About php.ini   ;
;;;;;;;;;;;;;;;;;;;

Code language: plaintext (plaintext)

次に、/usr/local/etc/php/7.2/conf.d/ext-xdebug.ini を新規作成して、テキストエディターで編集します。

$ touch /usr/local/etc/php/7.2/conf.d/ext-xdebug.ini
$ vim /usr/local/etc/php/7.2/conf.d/ext-xdebug.ini
Code language: Bash (bash)

さきほどphp.iniから削除したzend_extension=xdebug.soをext-debug.iniに記述します。

PHP CLIでxdebugを使うときは、次の1行だけあれば充分です。

zend_extension=xdebug.so
Code language: Bash (bash)

xdebug.soを絶対パスで指定したものをコメントで書いておきます。zend_extension=xdebug.so で動かないとき、絶対パスのほうを試したら動いたという記事がありました。

また、webサーバ用のリモートデバグ設定もコメントで書いておきます。PHP CLIのデバグでは、これらがコメントのままでもコメントをはずしても問題ありません。

zend_extension=xdebug.so
#zend_extension=/usr/local/Cellar/php@7.2/7.2.34_2/pecl/20170718/xdebug.so

#xdebug.mode=debug
#xdebug.start_with_request=yes
#xdebug.client_host=127.0.0.1
#xdebug.client_port=9000
Code language: Bash (bash)

ねんのため、PHPを再起動しておきます。

$ brew services restart php@7.2

$ php -v
Code language: Bash (bash)

ターミナルから実行する

PhpStormのプロジェクトが ~/projects/myproj 、プロジェクト下の app/main.phpをxdebugしたいとします。

プロジェクトディレクトリにcdします。

$ cd ~/projects/myprojCode language: Bash (bash)

ふつうに実行できることを確認します。

$ php app/main.php

それでは、xdebugで実行します。

(1)PhpStormの「Start Listening for PHP Debug Connection」をクリックして、リスンスタートします。電話の受話器のようなアイコンです。

微妙にアイコンが変化します。

(2)app/main.phpの適当な箇所にブレークポイントを設定します。行番号の右側をクリックすると赤丸がつきます。赤丸はブレークポイントを表します。ブレークポイントをはずすには、もう一度クリックして、赤丸を消します。

(3)ターミナルで、xdebugオプションをつけて、app/main.phpを実行します。ポートは 9000 ではなく、9003 です。また、-dxdebug.start_with_request=yes をつけることもポイントです。

$ php -dxdebug.mode=debug \
      -dxdebug.client_port=9003 \
      -dxdebug.client_host=127.0.0.1 \
      -dxdebug.start_with_request=yes \
      app/main.php

(4)初回だけ、Xdebugと接続してもいいですかと、PhpStormの確認ダイアログが表示されます。Acceptボタンをクリックします。

(5)PhpStormのブレークポイントで止まりました!

PhpStormのデバグボタンから実行する

次に、PhpStormの左側ファイルツリーのmain.phpから、デバグ実行するための設定です。

左側ファイルツリーのmain.phpを右クリック>「Run main.php」をクリックします。ふつうに実行できることを確認します。

(1)PhpStormの「Start Listening for PHP Debug Connection」をクリックして、リスンスタートします。電話の受話器のようなアイコンです。

微妙にアイコンが変化します。

(2)app/main.phpの適当な箇所にブレークポイントを設定します。行番号の右側をクリックすると赤丸がつきます。赤丸はブレークポイントを表します。ブレークポイントをはずすには、もう一度クリックして、赤丸を消します。

(3)左側ファイルツリーのmain.phpを右クリック>「Debug main.php」をクリックします。

残念ながら、ピンクの吹き出しで

Connection was not established.
Cannot start debugger session with 'Xdebug 3.0.3'

と表示されてしまいました。

(4)メニューのRun>Edit Configurations... をクリックします。

(5)Run/Debug Configurationsダイアログが表示されます。

左側で、PHP Script>main.php を選択します。

右側で、Interpreter options: に、次の内容を設定します。

-dxdebug.client_port=9003Code language: plaintext (plaintext)

PhpStormはデバグ実行時に、-dxdebug.client_port=9000 を指定するので、これを9003にするためです。

Interpreter:の右端の「...」をクリックします。

(6)CLI Interpretersダイアログが表示されます。

Configuration options:の右端のフォルダーアイコンをクリックします。

(7)Configuration Optionsダイアログが表示されます。

「+」アイコンをクリックします。

Configutaion directiveValue
xdebug.start_with_requestyes

ここで、xdebug.client_port=9003を指定しても、PhpStormが指定する9000のほうが優先されてしまい、9000のままでした。そこで(5)で、-dxdebug.client_port=9003 を指定しています。

「OK」ボタンをクリックして閉じます。

(8)CLI InterpretersダイアログのConfiguration options欄が「-dxdebug.start_with_request=yes」に変わりました。

「OK」ボタンで、各ダイアログを閉じます。

(9)左側ファイルツリーのmain.phpを右クリック>「Debug main.php」をクリックします。

(10)ブレークポイントで止まりました!

PHP CLI スクリプトをデバッグする | PhpStorm ドキュメント
PHP アプリケーションは、必ずしも Web アプリケーションではありません。さまざまなコマンドラインツール、デーモン、メッセージキュー処理アプリケーション、その他の種類のアプリケーションは、通常、PHP CLI で実行されます。PHP CLI デバッグセッションを開始するには、いくつかの方法があります。PhpStor...
タイトルとURLをコピーしました