Y-110's Wiki
[PHPプロファイリング: Xdebug(Xdebug2) + WinCacheGrind]
_ Xdebug + WinCacheGrind での簡単 PHP プロファイリング
xdebug は PHP 5 にも対応している, 高機能なデバッガモジュールです。
xdebug にはプロファイリング機能も備わっていて, スクリプトのボトルネック調査には非常に有用です。
ただ, xdebug 単体だとプロファイリングの結果を表示する機能はサポートされていないため, 別途プロファイル結果表示用のツールを使う必要があります。
Windows上で動作する WinCacheGrind というプロファイル結果表示ツールがありますので, これと組み合わせることで快適なプロファイリング環境が整います。
_ xdebug の入手
Xdebug の公式サイトからアーカイブを入手します。
現時点(2006/5/26)での最新版は, 2.0.0beta5 です。
Linux ではソースをダウンロードしてコンパイルします。
または, PECL経由で pecl install xdebug でインストールすることも可能です。*1
Windows は PHP のバージョン毎にモジュールが用意されているので, 解凍した DLL を extension_dir にコピーすれば OK です。
_ WinCacheGrind の入手
SourceForge:WinCacheGrind から最新パッケージをダウンロードします。
後は, ダウンロードした exeファイルを実行してインストールするだけです。
_ php.ini の設定
xdebug モジュールを読み込んでプロファイリングに関する項目を設定します。
extension=xdebug-2.0.0beta5.dll xdebug.profiler_enable = 1 xdebug.profiler_output_name = crc32 xdebug.profiler_output_dir = "C:/cygwin/tmp/xdebug"
出力されるプロファイル名は cachegrind.out.xxx で, xdebug.profiler_output_dir で指定したディレクトリに出力されます。
xdebug.profiler_output_name が crc32 だと xxx が作業ディレクトリの crc32 ハッシュとなり, crc32 以外だと PHP のプロセスIDとなります。*2
プロファイルを保存するディレクトリには, PHP実行ユーザの書込み権限を与えておくのを忘れないように。
PHP を Apacheモジュールとして利用しているなら, Apache の再起動を行って下さい。
後はプログラムを実行すれば, 指定したディレクトリにプロファイルが生成されます。
_ プロファイル結果表示
プロファイルの結果を表示するには, WinCacheGrind を起動して生成されたプロファイルを読み込むか D&D するだけです。
左のウィンドウには関数のコールスタックがツリー形式で表示されます。
右のウィンドウには選択されたツリー部分(Overall の場合はツリー以下)のプロファイル情報が表示されます。
_ オプション
Tools → Options でオプション設定できます。
フレームワーク等を利用していると, 関数コール数が多くてプロファイルの結果表示が見難くなるので, 重い部分だけを表示するようにします。
Displayタブの Threshold に閾値を入力して, それ以上に時間がかかっている関数だけを表示するようにできます。
右から2番目の ! を有効にすると, 閾値以上に時間がかかっている関数のみを表示します。
一番右にある手のオプションを有効にすると, PHP のネイティブ関数を非表示にできます。
また, 時計 or Σ のトグルオプションを有効にすることで, 時間表示かパーセント表示のどちらかに切り替えられます。
_ Line by Line
Line by Line のタブは, プログラムファイルそのものに対応した表示形式になっています。
Function 関数名。PHPネイティブ関数の場合は php::xxx の形式。 Self 自分自身の実行にかかった時間?なんだろこれ? Cum. 関数の実行にかかった時間 File 関数が定義されているファイル名 Called from 関数がコールされた場所
関数名をダブルクリックすると階層を辿っていけます。
Cum. が大きい関数を辿ると簡単にボトルネックの箇所までたどり着くことができて便利です。
_ Overall
Overall のタブは, ツリーで選択されている関数以下の情報を総合的に表示します。
Function 関数名。PHPネイティブ関数の場合は php::xxx の形式。 Avg.Self 自分自身の実行にかかった時間の平均? Avg.Cum. 関数の実行にかかった平均時間 Total Self Avg.Self のトータル? Total Cum. 関数の実行にかかった総合時間 Calls 関数コールの回数
Overall のタブでは, 関数コールの回数や平均時間, 総合時間などの情報を知ることができます。
関数を選択すると, 関数が呼ばれている場所やそこでかかっている時間などの情報が下のペインに表示されます。
下のペインの関数名をダブルクリックすると, 関数が呼ばれている場所まで移動できます。
_ 注意点
xdebug は便利なツールですが, 解析処理による負荷がかなりかかっています。
xdebug を有効にしたまま多数のリクエストを受けると一気に負荷が急上昇して, 最悪システムダウンする可能性もあります。*3
本番サービスを開始する際には, 必ず xdebug が無効になっていることを確認 して下さい。

pecl でインストールしたほうが pecl コマンドで管理できるようになりますのでこちらの方がオススメです
xdebug-2.0.0RC3 から xdebug.profiler_output_name の仕様が変わっています。デフォルトでは cachegrind.out.%p がプロファイル名として使用されます。
xdebug を有効にしたままユーザにメルマガを送ってしまって, その後悲惨な目に合いました...