2011.02.07 yossy a.k.a. 会長
こんにちは。平凡エンジニアの吉田です。
今回はXdebugによるPHPのプロファイリングについて書いてみます。
XdebugはPHPのエクステンションとして公開されている
デバッグ支援ツールです。
Xdebug
http://www.xdebug.org/
var_dump()出力を見やすく加工してくれたり、
PHP変数を管理してるzval領域の状態を確認できたり、
エラー時のスタックトレースを確認できたり、
関数呼び出しのトレースができたり、
リモートデバッグができたり、
プロファイリングができたり、
とっても便利です!
今回は、そんなXDebugちゃんのプロファイリング機能を紹介してみます。
※この記事では、Windows環境を仮定した説明なので、
Linux環境などの場合はdllをsoと読み替えてくださいませ。
まず、XebugはPHPエクステンションなので、php_xdebug.dllが必要になります。
php_xdebug.dllはここからダウンロード出来ます。
http://www.xdebug.org/download.php
PHPのバージョンによって、dllの種類が異なるので、
どれをダウンロードしていいかわからない場合は、
以下のページに phpinfo() の出力内容をコピペすると、
最適なdllを教えてくれます。
http://www.xdebug.org/find-binary.php
すばらしいですね!
php_xdebug.dllをダウンロードした次は、PHPの設定変更が必要です。
php.iniの[XDebug]セクションに設定を記述します。
例)php.ini
----8<----8<----8<----8<----8<----8<----8<----8<----
[XDebug]
zend_extension_ts="C:\xampp\php\ext\php_xdebug.dll"
xdebug.profiler_enable=1
xdebug.profiler_output_dir="C:\xampp\tmp"
xdebug.profiler_append=0
xdebug.profiler_output_name="cachegrind.out"
----8<----8<----8<----8<----8<----8<----8<----8<----
zend_extension_ts
先ほどダウンロードしたdllファイルを指定します。
この例では C:\xampp\php\ext\ に置いてます。
xdebug.profiler_enable
プロファイラを有効にするかどうか指定します。
1を設定すると有効になります。
xdebug.profiler_output_dir
プロファイラを有効にすると、リクエストごとに結果がファイルへ出力されます。
profiler_output_dirでは出力先のフォルダを指定します。
xdebug.profiler_append
プロファイル結果をファイルに追記するかどうかを指定します。
0を指定すると追記されずリクエストごとに上書きされます。
xdebug.profiler_output_name
プロファイリング結果を出力するファイル名を指定します。
固定文字列以外にも、URL名を付与する%sなどの修飾指定も可能です。
※修飾指定の詳細はこちらを参照ください。
http://www.xdebug.org/docs/all_settings#trace_output_name
その他の設定もありますので、詳細を知りたい方は
XDebugのマニュアルを参照ください。
http://www.xdebug.org/docs/profiler
設定が完了すると、PHPスクリプトが実行されるたびに
プロファイリング結果が出力されるようになります。
上記の設定例だと、C:\xampp\tmp\cachegrind.out に出力されます。
このcachegrind.outファイルは、テキストで開いて確認することも
できますが、人間が簡単に解読できるような内容ではありません。
幸いな事に WinCacheGrind というツールを使うことで、
GUIでプロファイリング結果を解析することができます。
WinCacheGrind
http://sourceforge.net/projects/wincachegrind/
ダウンロードしてきた WinCacheGrind.exe を実行すると
WinCacheGrindが起動します。
メニューの File から Open で C:\xampp\tmp\cachegrind.out を
開くと、プロファイリング結果が表示されます。
どのクラスのどのメソッドでどのくらい時間がかかっているのかを
知ることができ、さらにそのメソッドの中へドリルダウンして調査
することも可能です。
データベースへのクエリ回数が多い処理や、極端に時間のかかる処理
などを見つけることができるので、SQLやプルグラムを見直すことで、
パフォーマンスチューニングも可能です。
普段、仕事でプログラムを書いているときは機能要求を満たすことが
メインなので、非機能要求であるの性能についてはあまり、意識しない
ことが多いですが、測定方法を知っていればチューニングすることも
できるので、是非とも使ってみてください。
PHP Presentation SystemのサイトのDebugカテゴリにも有益な情報が
載っているので、興味のある方は見てみてください。
http://talks.php.net/index.php/Debugging
デワデワ。