プロファイラとは 【profiler】 - IT用語辞典
プロファイラとは、動作中のプログラムがどの処理をどういった順序で実行したかを監視するプログラム。
プログラムの障害を見つけるために用いられるよりも、プログラムの余計な部分を削るなどして高速化するために用いられることが多い。
PHP用の「XHProf」という便利なプロファイラーが紹介されていました。
PHPプログラムを解析して何処が重いか?がブラウザ上で簡単に分かる「XHProf」:phpspot開発日誌
PHPプログラムを解析して何処が重いか?がブラウザ上で簡単に分かる「XHProf」。
Callgraphというものが見れるらしい。
プログラム実行の遷移図みたいなもので、重い部分を赤とか黄で視覚的に表示してくれる…、ってこれは凄い!
PECL :: Package :: xhprof
XHProfの開発者は、アメリカのfacebook.comのエンジニアさんたちでした。
XHProfは、Facebookの開発で使われているツールなんですね。
XHProfを使ってみたら、プログラムの流れを可視化した「Callgraph」というグラフが便利でした。
Callgraphは、ボトルネックの発見だけでなく、プログラムの流れをトレースするときにも役立つと思います。
既存のPHPアプリをカスタマイズするときに、内部の動作がどうなっているのかを調べる等、使い方がいろいろありそうです。
(以下、XHProfのインストール方法&使い方のメモ)
●XHProfのインストール方法
XHProfのインストール方法が紹介されていました。
英語の紹介ページ
Installing the XHProf Extension
日本語の紹介ページ
【CakePHP】xhprofでCakePHPのパフォーマンスを丸裸にする | ECWorks Blog
コンパイル及びインストール方法は次の通り。
tar xvfz xhprof-0.9.0.tgz
cd xhprof-0.9.0/extension/
phpize
make
make test
make install
インストール後、php.iniを開き、エクステンションを登録します。
extension=xhprof.so
apacheを再起動し、一応phpinfo()でxhprofが正常に起動しているか確認します。
(ちなみに、ブログライターのMASA-Pさんは「PHPで作る携帯サイトデベロッパーズガイド」の著者でした。)
![]() | PHPで作る携帯サイトデベロッパーズガイド 滝下 真玄 秀和システム 2009-12 3150円 |
●Ubuntuで使用する場合
上記の手順を参考にして、WebサーバにXHProfをインストールしてみました。
WebサーバのOSは、Linux(Ubuntu 9.10)です。
●コンソール画面を起動
Ubuntu9.10にログインして、GNOME 端末等のコンソール画面を起動します。
(Webサーバを外部のパソコンから遠隔操作する場合は、SSHクライアントソフトを起動して、Webサーバにログインします。)
コマンドを入力するとき、いちいち管理者権限を付与する「sudo」をコマンドの前に付記するのは面倒なので、一番最初に「sudo su」を入力して、管理者としてインストール作業を行えば便利かも。
以下、シェルのコマンドプロンプト(root@web-server:/home/webapp# のような表示部分)は「#」と略記します。
# cd /var/www/ ←インストールする場所に移動
# wget http://pecl.php.net/get/xhprof-0.9.2.tgz ←XHProfの最新版をダウンロード
# tar xvfz xhprof-0.9.2.tgz ←圧縮ファイルを展開
# cd xhprof-0.9.2/extension/ ←展開したフォルダ内の「extension」フォルダに移動
# phpize ←コンパイルの準備処理
# ./configure --with-php-config=/usr/bin/php-config ←インストールの設定
# make ←コンパイル
# make test ←コンパイルエラーのチェック
# make install ←インストール
スムーズに行けば、上記の手順でインストールが完了するはずですが、自分の環境では途中でエラーが出ました。
●phpizeのインストール
インストールの途中で「phpize」というコマンドを打つと、「phpize」というコマンドは使えない(存在していない)というエラーメッセージが出ました。
phpize: command not found
対処法は、php5-devをインストールすれば「phpize」というコマンド(プログラム)が利用できるようになります。
# apt-get install php5-dev ←php5-devをインストール
(参考)
http://dqn.sakusakutto.jp/2009/11/ubuntu904peclmemcachedphpize.html
phpizeエラーが出る場合の対処法
http://www.php.net/manual/ja/install.pecl.phpize.php
phpize で共有 PECL 拡張モジュールをコンパイルする方法
もう一度やり直したら、今度はphpizeが無事通りました。
# phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
●コンフィギャ
# ./configure --with-php-config=/usr/bin/php-config
「php-config」というPHPの設定ファイルがどこにあるのか分からなくて、検索したら
/usr/bin/
の中にありました。
(参考)「php-config」って何?
http://php.net/manual/ja/configure.about.php
●make test
(参考)「make test」って何?
http://oshiete1.watch.impress.co.jp/qa5379043.html
インストールが完了したら、XHProfを使えるようにする設定を行います。
●php.ini
PHPの設定ファイル「php.ini」に、「extension=xhprof.so」という設定を追加します。
php.iniファイルがある場所
/etc/php5/apache2/php.ini
(参考)php.iniの場所、役割について
http://d.hatena.ne.jp/abe_koji/20080227/1204075329
http://itpro.nikkeibp.co.jp/article/COLUMN/20070307/264097/
php.iniのある場所に移動して、vimエディタを使って編集します。
# cd /etc/php5/apache2/
# vim php.ini
php.iniを開くと、拡張機能のディレクティブ(項目)をまとめてある場所があるので、そこに追記してみます。
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
;
; If you wish to have an extension loaded automatically, use the following
; syntax:
;
; extension=modulename.extension;
; For example, on Windows:
;
; extension=msql.dll;
; ... or under UNIX:
;
; extension=msql.so
;
; Note that it should be the name of the module only; no directory information
; needs to go here. Specify the location of the extension with the
; extension_dir directive above.
extension=xhprof.so ←XHProfを使うようにする設定
●Apacheを再起動
XHProfのインストールと設定が完了したら、Apacheを再起動して、XHProfを稼動させます。
# /etc/init.d/apache2 restart ←Apacheの再起動
●phpinfo()で確認
phpinfo()関数で、XHProfの稼動状況を確認します。
=「xhprof」という項目が表示されていればOK。

●XHProf UI設置
XHProfの動作を確認したら、いよいよXHProfの表示画面(ユーザーインターフェース)を設置します。
「xhprof_html」と「xhprof_lib」をドキュメントルート以下にコピーします。
上記の手順でやった場合だと、
/var/www/xhprof-0.9.2/
の中に「xhprof_html」フォルダと「xhprof_lib」フォルダがあるので、これを使えばOKです。
「xhprof-0.9.2」というフォルダ名を「xhprof」に変更しておくと良いと思います。
●XHProfの使い方
XHProfでプロファイリング(動作状況に関するデータを収集)するには、
・収集の開始点=xhprof_enable();
・収集の終了点=xhprof_disable();
という二つのコードを記述します。
使い方の詳細は、XHProfのドキュメントで紹介されています。
XHProf Documentation - 4. Profiling using XHProf
●CodeIgniterで利用
PHPフレームワーク「CodeIgniter」で、XHProfを使ってみました。
CodeIgniterでXHProfを使用するために、動作の開始ファイル(エントリーポイント)になっている「index.php」にプロファイラーのコードを入れてみました。
(1) index.phpの先頭部分に入れたコード
<?php
//----------------------------------------
// XHProfを使うかどうかの設定 TRUE / FALSE
$xhprof_mode = TRUE;
// start profiler
if ($xhprof_mode) {
xhprof_enable();
}
//----------------------------------------
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
というふうに、オプションも追加できます。
(2) index.phpの末尾部分に入れたコード
//----------------------------------------
// stop profiler
if ($xhprof_mode) {
$xhprof_data = xhprof_disable();
$XHPROF_ROOT = '/var/www/xhprof'; //xhprofをインストールしたディレクトリ
$XHPROF_SOURCE_NAME = 'CodeIgniter';
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://mydomain.com/xhprof/xhprof_html/index.php?run=$run_id&source=$XHPROF_SOURCE_NAME' target='_blank'>xhprof Result</a>";
}
//----------------------------------------
これで、CodeIgniterでXHProfが使えました。
●XHProfの汎用的な使い方
XHProfの使い方を便利にする方法が紹介されていました。
PHP用のプロファイラ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>";
}
xhprof_enable();
register_shutdown_function('__xhprof_finish');
?>
こんな感じのをauto_prepend_fileで指定しとけば自動的に全体をプロファイリングしてくれるようになる。
●auto_prepend_fileとは?
http://jp2.php.net/manual/ja/ini.core.php#ini.auto-prepend-file
auto_prepend_file string
メインファイルの前に自動的に付加されるファイルの名前を指定します。
CodeIgniterの場合、hook機能を使って自動的に呼び出す方法もありでしょうか?
【2012/04/25 追記 ここから】
(参考)CodeIgniterでXHProfをフックする方法 - 浜村拓夫の世界
【2012/04/25 追記 ここまで】
●XHProfの結果
実行されたメソッドや関数

処理の流れと所要時間

XHProfのcallgraphが気に入りました!
Facebookはこういう便利なツールを使って開発されているんですね。
いろんなPHPアプリのcallgraphを眺めてみようと思います。
- 関連記事
-
- PHP Framework 2010
- CodeIgniter2.0リリース
- PHPで数値(数字)を判定する方法
- NetBeansでPHP
- PHPで関数の呼び出し元を調べる方法
- DooPHPのコールグラフ
- PHPをC++に変換するHipHop for PHP
- PHPのプロファイラー「XHProf」の使い方
- 継承できるテンプレート「Twig」
- CodeIgniterのMatchBoxとHMVC
- 祝!1万部超え『PHP逆引きレシピ』プレゼントキャンペーン
- CodeIgniterをHMVCでモジュール化
- PHPで文字コードをSJISからUTF8に変換する方法
- PHPで配列の重複を削除する方法
- Fatal error: Allowed memory size of 16777216 bytes exhausted