xhprof でコールグラフを書く。


phpコールグラフ付きのプロファイルを撮りたかったので、xhprof入れた。
これも facebookの人が作ったプロダクト。facebookすごいなー。

pecl で入りそうなんだけど、peclでは入らないw
ソースからダウンロードしていれてみる。

#ここのサイトから最新版をダウンロードする。
#http://pecl.php.net/package/xhprof
wget http://pecl.php.net/package/xhprof/0.9.2

#解凍して、、
tar zxvf xhprof-0.9.2.tgz
cd xhprof-0.9.2/extension/

#phpize ./configure make make install
phpzie
./configure
make
make install

#一つ上の階層にあるプロファイル結果画面をインストール.
#どこに入れればいいかわからんので、 /usr/local/share とかに適当に。

cd ..
mv xhprof_html /usr/local/share
mv xhprof_lib  /usr/local/share


htmlの方は webroot以下にシンボリックリンクでも貼る。
ln -s /usr/local/share/xhprof_html /var/www/html/xhprof_html


ここまでで、エラーがでたよ!!って人
エラー1. -bash: phpize: command not found

phizieが入っとらん。
yum install php-devel
 or remi から最新版を使っている人は、
yum --enablerepo=remi install php-devel


エラー2
>Cannot find config.m4.
>Make sure that you run '/usr/bin/phpize' in the top level source directory of the module

ちゃんと以下のディレクトリに移動しましたか?
extension に入っていないとか、、せっかちさんだ。

cd xhprof-0.9.2/extension/


phpに組み込むよ!
vi /etc/php.d/xhprof.ini
-----------------------------
extension=xhprof.so
-----------------------------

httpd を再起動するよ。
/etc/init.d/httpd restart


phpinfo で確認するよ!

うまく認識していない人は、インストールからやり直してね!


次!
プロファイルを開始するところと、プロファイル結果をストアしたいところにコードを埋めるよ。

<?php

//プロファイル開始
xhprof_enable();

include("../lib/etc/config.php");
include("../lib/l/l.php");

//sinatra風のフレームワーク作ってる。
L_AppGet("/",function(){
	echo "/  !!";
	L_LoadTPL("index.tpl");

	//プロファイル結果を取得.
	$xhprof_data = xhprof_disable();

	//xhprofをインストールしたディレクトリ
	$XHPROF_ROOT        = '/usr/local/share';
	$XHPROF_SOURCE_NAME = 'lphp';
	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=\"/xhprof/index.php?run=$run_id&source=$XHPROF_SOURCE_NAME\">xhprof Result</a>\n";
});


プロファイルを開始したいところに

xhprof_enable();


プロファイルを終了して結果を取り出すところ
ソースはから。

//プロファイル結果を取得.
$xhprof_data = xhprof_disable();

//xhprofをインストールしたディレクトリ
$XHPROF_ROOT        = '/usr/local/share';
$XHPROF_SOURCE_NAME = 'lphp';
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=\"/xhprof/index.php?run=$run_id&source=$XHPROF_SOURCE_NAME\">xhprof Result</a>\n";


はい、結果を見てみましょう。
なんかリンクが表示されました。
xhprof Resultをクリックすると、

リンクをクリックすると、プロファイル結果が見れます。

うまくいってます。
コールグラフ見てみましょう。
View Full CallGraphをクリックするとー

コールグルフが表示されません、、、あれー?

Error: either we can not find profile data for run_id 4d44d5bec1892 or the threshold 0.01 is too small or you do not have 'dot' image generation utility installed.

グラフを書くには、graphviz が必要らしい。
とりあえずそれっぽいものを入れる。
#graphvizだけでいいと思うけど、一応入れるだけ入れてみる。

yum --enablerepo=remi  install graphviz graphviz-devel graphviz-gd graphviz-php

はい、うまくグラフが書けましたー。
やったー。