yuu_nkjm blog
2014-05-14(Wed) [長年日記] 編集
[XAMPP][PhpStorm][PHP][xdebug] XAMPP+PHPStormでリモートデバッグ
Windows 8 (64bit), xampp-win32-1.8.2-5-VC9,PhpStorm 7.1.3で動作した.
0. PHPの設定
PHPStromでPHPが使えるようにしておく.
1. デバッグするコードを動かすサーバの設定
1.1 php.iniの設定
ここで設定したxdbug.idekeyの値をPhpStormに設定する必要がある.Xdebugの設定はXdebug: Documentationを参照のこと.
[XDebug] zend_extension = "C:\xampp\php\ext\php_xdebug.dll" xdebug.profiler_append = 0 xdebug.profiler_enable = 1 xdebug.profiler_enable_trigger = 0 xdebug.profiler_output_dir = "C:\xampp\tmp" xdebug.profiler_output_name = "cachegrind.out.%t-%s" xdebug.remote_enable = 1 xdebug.remote_handler = "dbgp" ;; リモートでバッグを実行するホスト.この指定を*にしたい場合は,xdebug.remote_connect_back=1とする. xdebug.remote_host = "127.0.0.1" xdebug.trace_output_dir = "C:\xampp\tmp" ;; 個人専用の開発用のサーバーなら設定した方が良さそう.末尾の補足を参照. xdebug.remote_autostart = 1 xdebug.idekey = "*********"
1.2 サーバ側のXdebug起動/終了のブックマークレット作成
Xdebug & Zend Debugger bookmarklets generator for PhpStormで,サーバ側のdebuggerを起動したり停止したりするブックマークレットを作成できるので,作成する.
2. PHPStormの設定
2.1 Serversの設定
- Serversの設定をする.XAMPPで動かしているということはローカル環境で動かしているのだろうから,通常はUse Path Mappingは要らないはず.User path mappingsは,必要がない場合は選ばない.
- リモートサーバの場合は,ここでローカルのパス(c:\xxxxなど)とサーバのパス(/srv/wwwなど)をマッピングする必要がある.
多分だけど,ローカルサーバでも,シンボリックリンクを使った場合はこの設定が必要になるようだ.プロジェクトがE:\\workspace\worldにあって,C:\\xampp\htdocs\worldにシンボリックリンクを貼った様な場合,Absolute Path on the serverにC:\\xampp\htdocs\worldを設定する必要があるのではないか.むしろ設定しない方が良さそう.
以下は説明のために,"Use Path Mapping"にチェックを入れているが,チェックを入れないで動いている.
2.2 PhpStorm上でのデバッガ起動の設定
メニューのRunからDebug...を選択し,PhpStorm上でのデバッガ起動設定を作る.
デバッグの実行プロセス
xdebug.remote_autostart = 0の場合
- PhpStorm上でブレークポイントを設定する.
- PhpStorm上でのデバッガを起動し,Webサーバ上のXdebugからの接続を待ち受ける.
- デバッグしたいページを通常のWebブラウザで表示し,Webサーバ上のdebuggerを起動するブックマークレットをクリックする.
- デバッグしたいページを通常のWebブラウザでリロードするとデバッグが開始される.
- デバッグを終えたら,Webサーバ上のdebuggerを終了するブックマークレットをクリックする.終了しないとPHPの実行が遅いままのようだ.
xdebug.remote_autostart = 0の場合
ブックマークレットの操作が必要ない.
補足
外部サーバからのコールバック
外部のサーバからのコールバックが発生するようなプログラムの場合,デバッグセッションと認識されていないセッションからのアクセスとなり,そのアクセスに対してデバッグがonにならないのか?.一人で使う開発環境ならxdebug.remote_autostart = 1としたほうが無難か.
リフレクションを使ったメソッド割り当ての場合?
関数のシグネチャの行をブレークポイントとすると止まれず,関数の内部の行をブレークポイントとすると止まることがあった.
何でもかんでもプログラムの実行を止めたい
以下が重要.