概要
動作検証の為に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で以下のように設定を行います。
これで外部サーバ上でもデバッグが可能となります。
参考
- Remote Debugging PHP with a Firewall in the Way — Derick Rethans
- #10.1 PECLとか使えるようにする(+ xdebugインストール方法)::VMWare×CentOS5 Windowsでカンタン開発環境 - 肉とご飯と甘いもの @ sotarok
- ベイエリア情報局: Zend extension を extension_dir からロードできるようにしてみた