Android や Java EE で開発していたりすると、デバッグ実行によくお世話になる。ステップ実行で 1 つ 1 つ追っていくと、それでバグの原因が見つかったりするので重宝するものだ。
PHP では Xdebug を使用して同様の事が出来るのだが、設定が面倒だったり、Java ほど使い勝手が良くなかったりするので 結局 var_dump
や print_r
で問題箇所で変数の内容を出力する事でデバッグしてしまう。しかもそれで殆ど何とかなってしまう。
とはいえ、折角なので PhpStorm でステップ実行してみる。以下自分用メモ。
前提
最近は開発環境といってもデスクトップ OS (Windows / OS X / Linux) に直接 (W,M,L) AMP 環境を構築する事は少なくなってきた。 VM 上に Linux の環境を構築した方がスナップショットを撮っておけば失敗してもすぐに前の環境に戻せるし、 構築した環境を他の開発者に直接渡したりして同一環境での作業も容易となるからだ。
なので、今回は PhpStorm が稼働しているクライアントと実際に Apache が稼働しているサーバが別という前提で手順を記す。 クライアント OS が OS X という前提で記述するが、適宜読みかえれば恐らく Windows / Linux でも同様に使えるだろうと思われる。
OS X のデフォルト PHP に Xdebug を認識させる
PhpStorm のメニューから Preferences -> PHP で OS X 側の PHP のインタプリタを指定するが、ここでデフォルトの /usr/bin/php
を指定しても左画像のように Debugger: Not installed
と表示されてしまう。Xdebug が認識されていない。
ターミナルを開き、以下のように mdfind
コマンドで xdebug.so
の位置を特定する:
mdfind -name xdebug.so
/usr/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
mdfind
は find
コマンドに似ているが、mdfind
は Spotlight のコマンド版という所が違う。 Spotlight は予めインデックスを張っている為高速に動作する。
さて、これを php.ini に定義する。OS X の php.ini はデフォルトで存在しないが、テンプレートが php.ini.default として用意されているのでこれをコピーして使用する。
cd /etc
sudo cp php.ini.default php.ini
sudo chmod 600 php.ini # 何故か owner でも read-only になっているので
sudo vi php.ini
[xdebug]
zend_extension="/usr/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so"
設定が完了したら Apache を再起動する。
sudo /usr/sbin/apachectl restart
OS X のデフォルト PHP に Xdebug が認識されたかどうかを確認する。 OS X の Apache のデフォルトの DocumentRoot は /Library/WebServer/Documents
なので、 元々ある index.html 若しくはそれに準ずるものを削除し、直下に index.php として以下を配置:
<?php
phpinfo();
http://localhost/
にアクセスし、phpinfo の内容を表示する。xdebug の項目が正しく表示されているのを確認する。
サーバ側に Xdebug を設定する
サーバ側にも Xdebug をインストールする。以下 Ubuntu とするが、Ubuntu だと apt-get install php5-xdebug
で入るので、 同様に xdebug.so の位置を確認する。
find /usr/lib/php5 -name 'xdebug.so'
/usr/lib/php5/20100525/xdebug.so
同様に php.ini を書くが少し書くことが多い:
zend_extension = "/usr/lib/php5/20100525/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_port="9001" # 何故かデフォルトの 9000 だとうまくいかないことが多い
xdebug.profiler_enable=1
xdebug.profiler_output_dir="/tmp"
xdebug.max_nesting_level=1000
xdebug.idekey = "phpstorm" # PhpStorm 側で指定する IDE の識別子
xdebug.remote_connect_back=1
xdebug.remote_autostart=1
xdebug.remote_handler=dbgp
sudo /etc/init.d/apache2 restart
PhpStorm の設定
Preferences->PHP->Servers でデバッグサーバが作成されていなければ+ボタンで追加する。デバッガに Xdebug を指定。 Use path mappings にチェックを入れ、ローカルの File/Directory とサーバの Absolute path on the server をあわせる。 可能ならば Validate remote environment で Xdebug の有効性をチェックできる。
次に Preferences->PHP->Debug で Xdebug の port を 9001 番に変更する。 その次にその下の Preferences->PHP->Debug->DBGp Proxy にサーバの php.ini に指定した IDE Key, port (9001), サーバのホスト名 or IP を指定する。
最後に、Run->Edit Configurations... で上の+ボタンを押して「PHP Remote Debug」を追加、追加したウィンドウのサーバ及び IDE Key を指定する。 そして、PhpStorm の上部ツールバーに何やら電話のようなアイコンがあるので、これを押して Xdebug からの通信をリスンするようにする。 後は適当な箇所にブレークポイントを張り、正しくデバッガがその位置で停止してステップ実行できることを確認する。