ku-sukeのブログ

Just another hatena blog

NetBeans + MAMP + xdebug + webgrindメモ

 PM職をチームメンバーに委譲しつつ、サポートとしてひさびさにPHP書いてるのですが、環境構築を行ったのでメモ。

NetBeansPHPのステップ実行とプロファイルしたい

いまだvar_dump()をひたすらいろんな箇所に埋め込んでる人はいないですかー?はいわたしです。申し訳ございません。ちゃんとしないとダメだとおもって設定周りを見直すことにしました。xdebugを快適に使いたいのです!

ステップ実行って?

念のため解説すると、PHPを上から順番にスクリプトが実行されていく中で、好きな箇所で「処理を止めて」その段階での各変数の状態を見ることができるデバッグ手法の一つです。任意の箇所で定義済みの関数が見れて超便利なんですよね。

プロファイルって?

例えばindex.phpから始まって、フレームワークを起動したり、DB処理をする中で、どの処理が一番時間を食ってるのかを調べることです。
(XHProfが好きだったんですが、MAMPで導入めんどくさそうだったので見送りました。個人的なポリシーでMacにX11もhomebrewもいれてないのです。)

それが出来るのがxdebug

というデバッガーなんですがMAMPには元々入っているのです。
/Applications/MAMP/bin/php/php5.x.x/conf/php.ini
が設定ファイルなので、こいつを編集してやるだけで有効になります。

ちなみにryuzeeさんのブログを参考にさせていただきました。

[xdebug]
zend_extension="/Applications/MAMP/bin/php/php5.3.6/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so"
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.idekey=netbeans-xdebug
xdebug.profiler_enable=1
xdebug.profiler_output_dir="/Applications/MAMP/tmp/php"
xdebug.profiler_output_name = cachegrind.out.%s

下3行がプロファイラの定義部分、のこりがxdebug自体の設定になります。

NetBeansはほぼいじらなくてOK

xdebug側で設定したので、特にやることはありません。プロジェクトの設定を開き実行設定部分を、「ローカルWebサイト」にします。そしてmod_rewriteにしてるとかでブラウザのパスとNetBeansプロジェクトのパスが異なる場合のみ、詳細からパスのマッピングを行います。

設定例
/ /Application/MAMP/htdocs/hogeproject/public_html/

設定後適宜再起動したら、NetBeansの上部中央にある実行ボタンの右側、デバッグボタンを押せばブレークポイントが使用できるようになります。

Webgrindでプロファイルを見やすく

このデバッグで幾つかリクエストをこなすと、各リクエストごとに、function単位で実行時間が形相腐れるようになります。生ファイルはxdebug.profiler_output_dirで設定したフォルダに溜まっていくので、こいつを見やすく読み出すためにWebgrindを利用します。

jokkedk/webgrind · GitHub

ダウンロードしてきて、適当にMAMPのhtdocs内に放り込み、config.php

"/tmp"

 ↓

"/Applications/MAMP/tmp/php"

のように上記設定ファイルで定義した値と同じにするだけで、ブラウザ上で表示可能になります。

これでサクサクデバッグできますね!