2013-05-02

●NetBeans IDE 7.3 と PHP Xdebug 2.2 の通信設定

リモート環境のソースデバッグの通信設定を試行錯誤したメモです。
NetBeans と Xdebug をインストールしたけれどブレークポイントで実行が止まらない方の参考になれば幸いです。

NetBeans と Xdebug の通信イメージ
通信イメージは Xdebug のドキュメントの Remote Debugging の図が分かり易かったです。
これが目指すゴールです。
 
リモートのネットワーク環境と通信順序
今回のネットワーク環境は Client とサーバの間に Gateway が入ります。

 

 
  1. NetBeans デバッガセッション開始。WWWブラウザを経由してデバッグするファイルをリクエストする。
    このときローカルポート 9000 も開かれると思われる。
  2. Xdebug からポート9000に最初の接続。デバッグするファイルのパスなどが返る。
  3. NetBeans からデバッグを制御する要求を送る。ブレークポイントも送られる。
  4. Xdebug から要求の結果が通知される。(しばらく 3 と 4 が繰り返される。)
  5. PHPが終了するとHTMLなどのレスポンスが返る。
  6. NetBeans デバッガセッションを終了。
  7. DEBUG SESSION ENDED がWWWブラウザに表示される。
Home Gateway の設定
固定IPアドレス 10.0.0.1 のポート 9000 へのアクセスを NetBeans のPCの 192.168.0.42 のポート9000へ転送する設定をします。(静的NAT設定)
通常は接続元のIPアドレスを Server Gatesay の 10.0.1.1 に制限すれば良いはず。
Xdebugの設定
php.ini で設定します。うまく動作するまで remote_log を設定してみます。
 
[Xdebug]
zend_extension = "/usr/local/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so"
xdebug.remote_enable = On
xdebug.remote_host = 10.0.0.1
xdebug.remote_log = "/tmp/xdebug_remote.log"
remote_log の通信状況サンプル
  • Xdebug からの最初の接続ができない。または NetBeans からの応答が返っていない。
     
    Log opened at 2013-04-25 05:53:38
    I: Connecting to configured address/port: 10.0.0.1:9000.
    E: Could not connect to client. :-(
    Log closed at 2013-04-25 05:53:59
    

    私の場合 Home Gateway のセキュリティログを見るとポート9000への接続が破棄されていた。なんと Server Gateway のグローバルIPアドレスが www と xdebug で異なっていたので静的NAT設定を修正。
    また NetBeans からのパケットが固定IPアドレスの 10.0.0.1 を通らずに、動的IPアドレスの 10.0.0.2 を通るような設定してしまっていた。
     
     
  • NetBeans で指定したファイルが Xdebugでのデバッグ対象になっていない。
    NetBeans のブレークポイントのファイルパスがローカルのパスになっている。
     
    Log opened at 2013-04-26 06:05:33
    I: Connecting to configured address/port: 10.0.0.1:9000.
    I: Connected to client. :-)
    -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug"
     fileuri="file:///var/www/html/config/start.php" language="PHP" protocol_version="1.0"
     appid="11576" idekey="netbeans-xdebug"><engine version="2.2.2"><![CDATA[Xdebug]]></engine>
     <author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url>
     <copyright><![CDATA[Copyright (c) 2002-2013 by Derick Rethans]]></copyright></init> 
    (中略)
    <- breakpoint_set -i 4 -t line -s enabled -f
     file:///C:/Users/developer/Documents/NetBeansProjects/project1/index.php -n 47
    -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug"
     command="breakpoint_set" transaction_id="4" state="enabled" id="115760001"></response> 
    

    これは httpd.conf(.htaccess) に php_value auto_prepend_file "/var/www/html/config/start.php" があったため Xdebug がこのファイルをデバッグ対象と認識してしまうようだ。こうなると NetBeans もブレークポイントのパスを正しく組み立てられなくなるようだ。
    回避策はこの設定の代わりにソースに require_once '/var/www/html/config/start.php'; を追加することしか思いついていない。
     
     
  • ようやくブレークポイントで止まった。Xdebug のパスも NetBeans のパスも正しくなった。
     
    Log opened at 2013-04-27 09:56:26
    I: Connecting to configured address/port: 10.0.0.1:9000.
    I: Connected to client. :-)
    -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" 
     fileuri="file:///var/www/html/index.php" language="PHP" protocol_version="1.0" 
     appid="11890" idekey="netbeans-xdebug"><engine version="2.2.2"><![CDATA[Xdebug]]></engine>
     <author><![CDATA[Derick Rethans]]></author><url><![CDATA[http://xdebug.org]]></url>
     <copyright><![CDATA[Copyright (c) 2002-2013 by Derick Rethans]]></copyright></init>
    (中略)
    <- breakpoint_set -i 4 -t line -s enabled -f
     file:///var/www/html/index.php -n 6
    -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" 
     command="breakpoint_set" transaction_id="4" state="enabled" id="145340001"></response>
    

     
     
おわりに
実は Server Gateway はブラックボックだったので通信が遮断されるかと懸念していたがほぼ問題なかった。強いて言えば www と xdebug のIPアドレスが違っていることくらい。また Client PCのセキュリティソフト(カスペルスキー2013)も設定は不要だった。
最後まで分からなかったのは PHP の auto_prepend_file の設定だった。
以上、参考になれば幸いです。