echoで変数表示してデバッグはつらい
すぐ始められるデバッグ方法としては、echoやログを使用して怪しい部分にデバッグ用のコードを挿入し、実行→確認 をバグが見つかるまで繰り返す方法がありますが、これは効率が悪い上にけっこう辛いです。
echoでのデバッグ
- 処理が怪しい所に当りをつけて、echoで変数等を表示する処理を入れる。
- 表示する。
- 値は正しかった、違う所が原因だと事が分かる。1に戻る。
……
99.原因となる処理を見つける。
(たまに)redirectがあったのを忘れてて表示を見る前にリダイレクトされる。echoでの表示からログファイルの書き込みに変える。
Netbeansでのデバッグ
- 処理が怪しい所で実行を一時停止する。
- 使用中の変数一覧の値を確認
- 処理を1ステップずつ進め、バグの原因となる処理を見付ける。
- 終わり。
楽な上に効率も良く、嫌なデバッグ時間を短縮できます。
デバッグ機能を使用するのに必要な環境
- Xdebugが有効となっているWebサーバ
- netbeans-connectorが利用可能なウェブブラウザ
- Netbeansの設定で、xdebugとCakePHPが上手く動くようにする。
の3点です。
xdebug有効・無効の確認と設定
phpinfo() を表示し、xdebugの項目があればすでに有効となっています。
XAMPP環境の場合は、xdebugはインストールされていますが初期状態では無効となっているので、10分でできるXAMPPとXdebugのインストールを参考に、Xdebugを有効にします。
NetbeansでXdebugを動かすには、Xdebugの設定が以下となっている必要があるので、php.iniの該当部分を編集し、webサーバの再起動を行います。
xdebug.default_enable = 1
xdebug.remote_enable = on
; xdebug.remote_host = 127.0.0.1
xdebug.remote_port = 9000
xdebug.remote_handler = dbgp
xdebug.remote_autostart = 0
xdebug.remote_connect_back=1
debug.remote_host はXdebugに接続できるクライアントを制限するためのものですが、
LAN環境等、安全が環境であればコメントアウトをおすすめします。
netbeans-connector が利用可能なブラウザ
現在では
- Chrome
- Netbeans込み込みのWebKitブラウザ
のみです。Chromeを使用する場合は、こちらから入手します。
Netbeansの設定で、xdebugとCakePHPが上手く動くようにする。
CakePHPはmod_rewriteの機能を使用してブラウザからのアクセスをルータスクリプトに転送しています。Netbeansはこの挙動を自動検出できないため、開始ファイルにルータースクリプトのパスを明示的に指定する必要があります。
プロジェクトを右クリックし、構成→カスタマイズから実行環境を選び、開始ファイルを設定します。
CakePHP2の場合
開始ファイルはCakePHPのバージョンで異なるので、バージョンに合わせ、
- CakePHP2: app/webroot/index.php
- CakePHP3: webroot/index.hp
をそれぞれ指定します。
また、デフォルトではデバッグを開始する毎に最初に実行したphpプログラムの先頭で一時停止します。
このため、CakePHPを使用していると毎回フレームワーク部分で停止し、効率が悪くなります。
この動作を止める場合は、preferencesz→PHP→デバッグ で「最初の行で停止」のチェックを
外します。
デバッグ実行
デバッグを開始するには、予め一時停止させたい行の行番号をクリックし、ブレークポイントを設定した状態で、「プロジェクトをデバッグ」を押します。これで Xdebugを使用して、NetbeansでCakePHPのデバッグができるようになります。
デバッガの詳しい使用方法は、NetBeans IDEでのPHPソース・コードのデバッグを参照してください。
番外 Norton Internet Securityを利用している場合
xdebugで利用するポート9000がNortonでも利用されているため、上記では動作しません。
デバッグ開始時にポートがすでに利用されている旨の警告が出ます。
Netbeansのxdebugポートと、サーバ側のxdebug.remote_port を開いてるポートに変更して対応します。