PhpStorm から Vagrant で構築した VM の PHP アプリケーションをリモートデバッグする方法です。Web アプリケーションだけでなく、CLI アプリケーションでもリモートデバッグできるように設定していきます。
VM スペック
- 192.168.33.41 を private network で設定
- PHP + Xdebug がインストール済み
- ホストと VM は、synced folder でディレクトリを共有(/path/to/src -> /share)
0. Xdebug によるリモートデバッグの仕組み
リモートデバッグを設定する前に PhpStorm と Xdebug がどのように通信するかを見ておきます。これを理解しておくと設定がスムーズです。
下記は、Xdebug の公式サイトに掲載されている図です。ここでは、左の「IDE」が PhpStormが起動しているホスト、右の「PHP/Xdebug」が Vagrant で構築した VM と考えて下さい。
VM に HTTP リクエストが来て、PHP スクリプトの実行がはじまると、PHP/Xdebug が IDE(xdebug.remote_host
で設定したホスト)に DBGP connect の通信を行います。PhpStorm ではこの通信を受け取り、以後は DBGP で相互に通信してリモートデバッグを実現します。
ここで大切なのは、PHP/Xdebug(VM)から、PhpStorm へ DBGP connect の通信が来るという点です。これは Web でも CLI でも同じで、PHP スクリプトが VM で実行されると PhpStorm へ DBGP connect が送られてきて、リモートデバッグを開始することができます。(xdebug.remote_autostart= On
を設定した場合)
もし、うまく動かない場合などは、この点を意識して調査すると良いです。
では、実際に設定を行っていきましょう。
1. VM での設定
まず、VM にインストールされている PHP にリモートデバッグ用の設定を行います。通常は、VM を構築する際に実行するプロビジョニングに以下を含めておきます。
Xdebug が必要になるので、下記のコマンドなどで、インストールしておいて下さい。
$ yum -y install php-pecl-xdebug
1-1. php.ini(xdebug.ini)
Xdebug の設定を php.ini
等で以下のように設定します。
xdebug.remote_enable = On xdebug.remote_autostart = On xdebug.remote_host = 192.168.33.1
xdebug.remote_enable
で、リモートデバッグを有効にします。xdebug.remote_autostart
を On にすることで、リモートデバッグが常に開始されるように設定します。任意のタイミングだけ開始することもできるのですが、開発環境なので、VM側では常に開始されるようにしておき、実際にデバッグを行うかどうかは PhpStorm 側で操作します。xdebug.remote_host
で、デバッグクライアントの IP を指定します。Vagrant の private network で192.168.33.xxx
を設定しているので、ホスト側の IP として192.168.33.1
を設定しています。
1-2. 環境変数
CLI アプリケーション(phpunit
コマンドでのテストを含む)でのデバッグを行うために、環境変数PHP_IDE_CONFIG
を設定します。
CLI アプリケーションを実行するユーザでPHP_IDE_CONFIG
環境変数を定義したいので、ここでは、vagrant ユーザの ~/.bashrc
に設定しておきます。
192.168.33.41
の部分には、VM の IP を指定しておきます。
export PHP_IDE_CONFIG="serverName=192.168.33.41"
もし、apache ユーザで CLI アプリケーションを実行するなら、httpd.conf 等の SetEnv
などで設定すると良いでしょう。
2. PhpStorm での設定
PhpStorm でリモートデバッグクライアントの設定を行いましょう。
2-1. PHP Remote Debug
まず、メニューの [Run] – [Edit Configurations…] をクリックして、[Run/Debug Configurations] ダイアログを開きます。
次にダイアログ左上にある [+] をクリックして、[PHP Remote Debug] を選択します。すると、下記のように PHP Remote Debug の設定フォームが表示されます。ここでリモートデバッグの設定を入力していきます。
Name には、この設定の名称を指定します。ここではVagrant
としています。
Servers には、PHP サーバをプルダウンで選択するのですが、まだ設定が無いので、後ほど設定します。
Ide key は、今回は設定不要なのですが、何かしら値が必要なので、ダミー値を入力します。
2-2. Servers
Servers にサーバを追加するために、Servers のプルダウンメニュー横にある「…」ボタンをクリックします。クリックすると、[Servers] ダイアログが開きます。
[Servers] ダイアログでは、PHP アプリケーションが動作しているサーバの情報(ここでは Vagrant VM)を設定します。
ダイアログ左上にある [+] をクリックして、新規サーバを入力します。
Name には、名称を入力します。名称は何でも良いのですが、ここでは VM の IP を入力します。この値は、VM で設定した環境変数PHP_IDE_CONFIG
の中で記述するserverName=
の値と同じ内容にする必要があります。
Host には、VM の IP を入力します。
Use path mappings にチェックを入れます。ここでは、ローカルのファイルパスと VM でのファイルパスをマッピングを設定します。
この Vagrantfile では、ローカルの /path/to/src
を VM 上では /share
というディレクトリにマウントしているので、File/Directory
で /path/to/src
を選択し、その右にある Absolute path on server
に /share
と入力しておきます。
設定例は下記になります。
[OK] をクリックすると Servers ダイアログが閉じます。この時に [Run/Debug Configurations] では、Servers
には、現在設定したサーバが選択されています。
最後に [OK] をクリックすると、設定が保存され、ダイアログが閉じます。これで設定は完了です。
3. 動作確認
では、実際にリモートデバッグを試してみましょう。
PhpStorm でリモートデバッグを有効にするには、[Run] – [Start Listen for PHP Debug Connections] をクリックします。クリックすると [Stop Listen for PHP Debug Connections] という表示に切り替わります。この状態で、再度クリックするとリモートデバッグが停止します。
今回の設定では、VM 側は常にリモートデバッグ可能な状態になっているので、PhpStorm でのこの操作でリモートデバッグを行うかどうかを切り替えることができます。
リモートデバッグが動作しているか確認するのに、[Break at first line in PHP scripts] にもチェックを入れておきます。
3-1. Web アプリケーション
では、ブラウザから、VM にある PHP スクリプトにアクセスしてみましょう。(ここでは、Laravel アプリケーションを動かします。)
http://localhost/
にアクセスすると、処理が停止して、PhpStorm のデバッガが起動しました。
これは [Break at first line in PHP scripts] にチェックが入っているためで、一番はじめの行で処理が停止するようになっています。[Step Over] や [Step into] で、順にコードを実行して、PhpStorm 上で実行されている行が正しく遷移するか確認すると良いでしょう。
確認が終わったら、[Run…] でコードを実行する、もしくは [Stop] で停止させましょう。
3-2. CLI アプリケーション
CLI アプリケーションについてもリモートデバッグができるか確認しましょう。
vagrant ssh
で、VM にログインして、何か PHP アプリケーションをコマンドラインで起動します。ここでは php artisan
コマンドを実行します。
$ php artisan
すると、Web アプリケーションと同じく、はじめに実行される行で処理が停止し、PhpStorm のデバッガに制御が移ります。
PHPUnit なども実行して、同様になるか確認しておくと良いでしょう。
これで、Web でも CLI でも PHP アプリケーションでリモートデバッグができるようになりました。あとは順に実行するなり、任意のコードにブレイクポイントを仕掛けるなり、デバッグを行うことができます。
なお、動作確認用にチェックしておいた [Break at first line in PHP scripts] ですが、アプリケーション実行の度に停止するのは面倒なので、普段はチェックは外しておきましょう。
4. トラブルシューティング
4-1. デバッガが起動しない
おそらく基本的な設定ミスなので、手順を再確認します。
- xdebug 関連の設定変更後に Apache/php-fpm の再起動を行う
- PhpStorm で[Start Listen for PHP Debug Connections]を行う
4-2. デバッガは起動するのに、ステップ実行できない
PhpStorm の [Servers] 設定のパスマッピングの設定を見直します。
4-3. Cannot accept external Xdebug connection: Cannot parse the value of ‘$_SERVER[‘PHP_IDE_CONFIG’]’
CLI アプリケーションでリモートデバッグを行う際に発生しました。
環境変数PHP_IDE_CONFIG
が正しくセットされていなかったので、VM 側の設定を見直します。
さいごに
PhpStorm から Vagrant で構築した VM へのリモートデバッグ設定について見てきました。
はじめは面倒に見えますが、慣れてくればかなり楽に設定できます。VM 側の設定は、プロビジョニングに記述しておくと良いでしょう。
やはり、処理の流れはデバッガを使った方が掴みやすいので、ぜひ活用してみてください。
参考
http://www.jetbrains.com/phpstorm/webhelp/run-debug-configuration-php-remote-debug.html
http://www.karakaram.com/phpstorm-vagrant-remote-debug
http://blog.jetbrains.com/webide/2012/03/new-in-4-0-easier-debugging-of-remote-php-command-line-scripts/