これのきっかけ
開発機がWindowsなので、実際の動作環境に合わせてvagrantでCentOSを建てApache,MySQL,etc等をインストールし、やった環境構築完了!と思っていた時期がありました。
環境
[root@localhost /]# php -v
PHP 7.1.17 (cli) (built: Apr 25 2018 08:30:10) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.1.17, Copyright (c) 1999-2018, by Zend Technologies
with Xdebug v2.6.0, Copyright (c) 2002-2018, by Derick Rethans
/etc/15-xdebug.ini
; Enable xdebug extension module
zend_extension=xdebug.so
xdebug.remote_enable=true
xdebug.remote_autostart=1
xdebug.remote_connect_back=1
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
これでWeb画面へアクセスすると、Windows側の9000番ポートで待ち受けしているエディタではブレイクポイントが利用できるようになります。
PHPUnitを使う場合、テストケースをある程度書いたら動作確認のためホストOS側のエディタから起動しますが、その場合ホストOS(=Windows)にもゲストOSと同じライブラリを用意しなきゃならないことに気が付き、ちょっと絶望したのでPHPUnitもゲストOSで実行することに。
PHPUnitをゲストOSで起動する(デバッグ起動もする)
RunTest.php
<?php
// 実行したいテストケースPHPへのパス
$testClass = $_GET['test_class'];
// vagrantで起動しているゲストOSから見たホストOSのIPアドレス
$host = `netstat -rn | grep "^0.0.0.0 " | cut -d " " -f10`;
$phpunit = "phpunitへのパス"
$bootstrap = "--bootstrap テスト準備.phpのパス";
shell_exec("XDEBUG_CONFIG='remote_host={$host}' phpdbg -qrr $phpunit $testClass $bootstrap");
CLIでデバッグする場合はXDEBUG_CONFIG
を空でも良いので設定する必要があるため、ついでにXDEBUG_CONFIG='remote_host={$host}'
でデバッグ情報がホストOSに送信されるようします。
後はRunTest.phpへHTTP.GETでテストクラスを渡して実行すれば、9000番ポートを使ってステップ実行ができるようになります。
参考
Vagrantで、ゲストOSからホストのIPを取得する方法
PhpStormでVagrant上のCLIのPHPをXdebugする