このエントリーをはてなブックマークに追加 Clip to Evernote
リモートデバッグまでの道のりを解説します。
手順だけを纏めたサイトは多いですが、理解せず進むと、扱っている環境やバージョンなど、ちょっとした違いで躓くことになるため、ここでは概要から解説します。

開発環境としてよく使われている、VirtualBoxで、WindowsにゲストOSとしてLinuxがインストールされている状態を想定します。
IDE(統合開発環境)はIntelliJのphpstorm、スクリプトはPHP(WEBとして)、の想定です。
他のIDE(netbeansやeclipse等)や言語でも概要は同じです。

クライアントとサーバの通信、IDEがどういうものであるか、デバッグとは?といったこと、また、LinuxのコマンドやWindowsの基本操作は理解されている前提で解説します。

【リモートデバッグの概要】

まず、ここでの「デバッグ」は、コードを変えずに変数の値などを確認する作業のことを言います。
IDEのデバッグは通常、ローカルのソースに対して行うものですが、これだとサーバ上の環境と異なる場合があるので、結果が必ず本番でも一致するとは限りません。
かといって、サーバ上にIDE入れるのも、OSやライセンスの壁があります。
そんなときに有用なのがリモートデバッグです。

リモートデバッグでは、サーバ上のスクリプトにブレークポイントを設定して、変数の値などをIDE上で確認することができます。
(実態は、サーバ上のデバッグ情報をIDEがブレークポイントまでに加減して表示してるだけかもしれませんが、見た目には、ローカルのスクリプトと同じようにデバッグしてるように見えます。)

【リモートデバッグ実行の流れ】

(1)ローカルのコードのファイルのパスと、WEBサーバのURLのパスをphpstormで紐づけ
 例)c:\xampp\htdocs\index.php と  Webサーバホスト(ドメイン名)/index.php を紐づけ

(2)デバッグの識別キーを予めIDE側とサーバ側のxdebugに設定
 例)PHPSTORM

(3)IDEでデバッグ専用のポート(9000とか9001とか。xdebugが使用)を待ち受け開始
 ※デバッグ用のポートをFirewallで開けておくこと。
 ※ここからはIDEとサーバで専用のポートを使ってデバッグ情報がやりとりされる。

(4)ブラウザのブックマークレットを実行してCookieにデバッグ状態識別のCookieを設定
 ※ブックマークレットはIDEが提供してます。

(5)ブラウザでデバッグしたいURLにアクセス
 ポート80でアクセスすると、サーバのxdebugが専用ポートにデバッグ値を返してきます。
 ブレイクポイントを設定していればそこでとまって、それまでの変数の値などがIDE上に 出力されます。
 (サーバのxdebugはすべての実行結果を返してる。それをIDEがブレイクポイントまでに
 制限して表示してる?)
 ※開発中のコードとサーバにあるコードが違うと、ずれた位置でとまる
(6)リモートデバッグを中止する場合は、ブラウザのブックマークレットでデバッグ状態のCookieを削除
(7)IDE側の待ち受けを停止

※WEBなので、ブレイクポイントで逐一ブラウザの描画が止まるわけではありません。
(WEB出力用のバッファが出力されるタイミングで一気に描画されます)

では、いよいよ、リモートデバッグを実行するまでの設定を開設します。

ホストOS(ここではWindows)にphpstormとApache、PHP、XDebug(PHPのモジュール
※phpinfoで確認できます。)が入ってる前提、
ゲストOD(ここではLinux)にApache、PHP、XDebugが入ってる前提です。
また、ホストOSのブラウザから、ゲストOSのWEBサーバにアクセスできている前提です。

【ゲストOSでやること】

(1)PHPの設定(php.ini等)ファイルに以下を追記してApacheを再起動
 xdebug.remote_enable=1
 xdebug.remote_autostart=1
 xdebug.remote_host=[デバッグするホストOSのIPアドレス]
 xdebug.remote_port="9000"        #9000で上手くいかない場合は9001を設定
 xdebug.profiler_enable=1
 xdebug.profiler_output_dir="/tmp"
 xdebug.max_nesting_level=1000
 xdebug.idekey="PHPSTORM"  #デバッグのキーとする任意の文字列
 (サーバのxdebugとクライアントのxdebugが通信するためのキー)

(2)必要に応じてfirewallを設定。
 ポートを締めている場合は、(1)で設定したポートにホストOS側からアクセスできるようにfirewallを設定する必要があります。

設定が反映されているかはphpinfo()で確認できます。
エラーになる場合はXDebugがインストール済かをphpinfo()で確認し、入ってない場合はインストールしましょう。

ゲストOSでやることはこれだけです。
次にホストOS側の設定に進みます。ホストOS側は、IDEとブラウザにそれぞれ設定を行います。

【ホストOSでやること】

(1)IDEのリモートデバッグを設定
 (1-1)
 Preferences->PHP->Debugを開き、XdebugのportをゲストOSの(1)で設定したポート番号を設定

 (1-2)
 [Servers]を開いて任意の名前を設定
 HostにゲストOSのIPアドレスを設定
 Portに80を設定
 DebuggerにXdebugを選択
 Use path mappings にチェックを入れてローカルのファイルとWEBでアクセスした場合のパスを紐づけ

 (1-3)
 [Run/Debug Configurations]を開いてPHP Remote Debugに設定を追加。
 任意の名前を付けて、Serversで、(1-2)で設定した名前を選択、ide key(session id)にゲストOSでやることの(1)で設定したxdebug.idekeyの文字列を設定
 ※PHP Remote Debugの項目がない場合はIDEにリモートデバッグのモジュールを追加

(2)ブラウザにIDEから提供されているリモートデバッグ用のブックマークレットを追加

ホストOS側でやるとこは以上です。


これでリモートデバッグのための設定は完了です。
実際にリモートデバッグの操作を行う手順は以下の通りです。
実行の手順を守らないと設定が上手くいっていても期待通りのデバッグにならないので注意が必要です。


【リモートデバッグ実行の流れ】

(1)ソースコードを開き、ブレークポイントを設定

(2)IDEでデバッグ専用のポートを待ち受け開始
 [Run]>[Start Listen for PHP Debug Connections]をクリックする
 ※[Run]>[Break at first line in PHP scripts]にもチェックを入れておくと必ず1行目で止まるのでわかりやすいです。
 ※設定に不備がある場合、デバッグウインドウに赤字でメッセージが表示されます。
  青字は状態を表すメッセージです。

(3)ブラウザでデバッグするURLを開く

(4)ブラウザのリモートデバッグ開始用ブックマークレットを実行してリロード
 IDEのブレイクポイントでコードが止まってハイライトされます。
 止まっている箇所までの変数の値が表示されていればOKです。
 
 ※リモートデバッグが正常に動作しない場合は、ゲストOSの設定、ホストOSのIDEの設定がきちんと反映されているか、双方のファイアウオールの設定がデバッグ用のポートを通すようになっているかを確認しましょう。

(5)デバッグを終了する際は、ブラウザのリモートデバッグ終了用のブックマークレット
 を実行し、(2)の[Start Listen for PHP Debug Connections]をクリックします。