【PHP】NetBeans+Xdebugを利用してリモートデバッグ | 稼働率99.9%

稼働率99.9%

春日井市でiPhoneアプリの開発を行っています。iPhoneを使い出してからそれに伴って開発環境もWindowsからMacへと移行しました。MacやiPhoneだけでなくIT全般について日々感じた事や思った事を備忘録として記録する事を目的としたブログです。

概要


動作検証の為にPHPをステップ実行したかったので「xdebug」の環境を構築したけど正常に動作しない。
現象としては、デバッグ実行後にすぐにプログラムが実行され「NetBeans」側ではいつまでも接続待ち状態
になっていました。
要因が色々とあり一つずつ検証した結果ようやく動作しました。

動作環境

以下の環境で検証
サーバ
  • CentOS 6.2
  • Apache 2.4.3
  • PHP 5.4.8
  • xdebug 2.2.1
クライアント
  • Windows 8
  • NetBeans 7.2

とりあえず手っ取り早く動作させるには

※VirtualBox上の上記サーバ環境の場合
1.「Apache」、「PHP」をソースからインストール
2.PECLコマンドから「xdebug」をインストール
 #pecl install Xdebug
3.php.iniに以下の設定を記述
 [php]
 zend_extension=[extension_dirのパス]/xdebug.so
 [xdebug]
 xdebug.remote_enable=on
 xdebug.remote_host=[クライアント側のIPアドレス]
 xdebug.idekey=[NetBeansで設定されているセッションID]
4.ファイアウォールが設定されている場合はサーバからクライアントへの接続ポートを開けておく。
 ※クライアントからサーバではない点に注意
5.NetBeansからデバッグを実行し、ステップ実行が可能か確認します。

考えられる要因

以下に記述した要因は間接的に動作不良に関わってくるものだと思います。
1.ファイアウォール
 当初、外部サーバを利用していた事による接続ブロックが考えられました。
 サーバ、ルータ、クライアントのファイアウォールの設定を変更してみましたが、結果は同じで動作しませんでした。
2.Apache+PHPのバージョン
 最新環境で構築した事による仕様変更が考えられました。
 以前、Eclipse環境でxdebugによるリモートデバッグ環境を構築した際は、Apache2.2+PHP5.3でした。
 なのでこの時のメモを元に設定したのですが、あまりよくありませんでした。
3.NetBeansでのデバッグ
 xdebugのバージョンに対応していないのかなと思いましたが、全然関係ありませんでした。
 設定自体も実行環境の指定(URL)だけなので何か別に必要になる事はありません・
4.ローカル環境でのデバッグ
 レンタルサーバ上つまり外部ネットワークではなく、ローカル上のApacheなら動作するかと思いましたが、
 これでも全く動作しませんでした。

直接の原因

原因は、「xdebug」は拡張モジュールは拡張モジュールでも【Zend拡張モジュール】という事です。
つまり、PHP.iniに
  extension=xdebug.so
ではなく
  zend_extension=xdebug.so
さらにzend_extensionの場合はextension_dirの指定が有効でない為、フルパスで記述する必要があります。
なので最終的に
  zend_extension=/usr/local/lib/php/extensions/no-debug-zts-20100525/xdebug.so
と記述しないといけませんでした。
あまり気にしていませんでしたが、phpinfoにはしっかりとモジュールがロードされていないメッセージが表示
されていました。

また、xdebugの公式ドキュメントにも「zend_extension="/usr/local/php/modules/xdebug.so"」と記載されており、
さらに「You should ignore any prompts to add "extension=xdebug.so" to php.ini — this will cause problems.」
(プロンプトに表示されている設定は無視しろ。これが問題の原因になります。)とご丁寧に書かれていました。

レンタルサーバでSSHポートフォワーディングによるデバッグ


レンタルサーバ上でデバッグがしたい場合、ルータのファイアウォールやセキュリティー対策などプログラミングに全く関係しない点を
考慮する必要が出てきます。ただ、デバッグしたいだけなのに・・・。
そこでお手軽にする為にSSHポートフォワーディングを使用します。
puttyで以下のように設定を行います。



これで外部サーバ上でもデバッグが可能となります。

参考