PHP用のプロファイラXHProf

今までPHPのプロファイリングはXdebugとWinCacheGrindを使っていたんだけど、XHProfとかいうのが便利らしい。
※画像撮るのが面倒だったので、画面は参考サイトなどを参照w


まだbetaみたいだけどPECLのプロジェクトになっていて簡単にインストールできる。逆にWindowsだと……/(^o^)\
ソースコードに開始点と終了点を書き足さないといけないのがイマイチだけど、逆にターゲットを絞って計ることもできるし、面倒なら別ファイルに書いてauto_prepend_fileで透過的に処理するというのもありかと。


本体はプロファイルデータを配列で返す機能と、ファイルに保存する機能しか持ってないので、統計データを見るには同梱のビューアアプリを使う必要がある。PHPで出来ていてブラウザ経由で使うことになる。


WinCacheGrindだと絞り込んだり色々できるんだけど、ブラウザベースだとどうなんだ? と思ったけどリンクをぽちぽちクリックしていくと色々な観点からちゃんと見られるようになっている。
特定の関数だけ見ることもできるし、その関数の呼び出し元を一覧で見たりもできる。便利。……便利っつーかそのぐらいできないと役に立たないけど。
ざっと触ってみた感じだとWinCacheGrindよりも見やすいかも。ボトルネックがすぐに見つけられる。
あと他のプロファイルデータとdiffを取って見る機能もあって、改変前と改変後でどう変化したかわかるのもよい。


あとダイアグラムを画像として表示する機能もあるんだけど、dotとかいうグラフィックライブラリが必要なのと、きっとカオスな図になるんだろうなぁと思ったので試してない。


とりあえず今後はXHProfを使っていこうかな。

(おまけ)auto_prepend_fileで自動的に

<?php

function __xhprof_finish() {
    // stop profiler
    $xhprof_data = xhprof_disable();

    $XHPROF_ROOT        = '/home/webap/xhprof';  // xhprofをインストールしたディレクトリ
    $XHPROF_SOURCE_NAME = 'app_name';            // アプリ名とか識別する名前
    include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
    include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

    $xhprof_runs = new XHProfRuns_Default();
    $run_id = $xhprof_runs->save_run($xhprof_data, $XHPROF_SOURCE_NAME);

    // ビューアへのリンク(お好みで)
    echo "<a href=\"http://xhprofのビューア/index.php?run=$run_id&source=$XHPROF_SOURCE_NAME\">xhprof Result</a>\n";
}

xhprof_enable();
register_shutdown_function('__xhprof_finish');

?>


こんな感じのをauto_prepend_fileで指定しとけば自動的に全体をプロファイリングしてくれるようになる。
register_shutdown_functionがミソ。これで異常終了するような場合でもちゃんとxhprof_disableしてくれる。


ただしアクセスするたびにプロファイルデータファイルが溜まっていくので気をつけた方がいい。
特定の変数でon/offするような仕組みにした方がいいかもしれない。