ECWorks Blog

ECWorks Blog

CakePHPを中心としたサイト開発情報をメインに公開。新しもの好きなので時々製品レポートなんかも。

【CakePHP】xhprofでCakePHPのパフォーマンスを丸裸にする

cake-logo最近、はてブを眺めていたら、面白いツールを紹介されていましたので、早速CakePHPで使ってみた、というレポートです。

▼PHPプログラムを解析して何処が重いか?がブラウザ上で簡単に分かる「XHProf」:phpspot開発日誌
http://b.hatena.ne.jp/entry/http://phpspot.org/blog/archives/2009/03/phpxhprof.html

これは面白い!!
自分の組んだPHPプログラムが、本当に丸裸。どこがボトルネックになっているか、一目瞭然です。

というわけで、早速ですがCakePHPも、このツールで解析してみることにしましょう。
とりあえず簡単に手順をまとめておきます。
環境によって適用方法が異なると思いますので、その辺は良きに計らってください。

1:xprofのインストール

xhprofはpeclのプロジェクトです。
peclツールを使って自動インストールすることも出来るみたいなのですが、当方の環境ではphpizeでエラーが出るため、マニュアルインストールしました。

▼pecl : xhprof
http://pecl.php.net/package/xhprof

コンパイル及びインストール方法は次の通り。

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が正常に起動しているか確認します。

2:表示ツールのインストール

xhprofの情報は、起動プログラム内でvar_dump()を使って出すことも可能ですが、とても見にくいために、表示サイトを作ることで比較的見やすい情報を得ることが出来ます。
なので、CakePHPとは別の場所に、表示ツールを設置することにします。
表示ツールは、解凍ファイル内の「xhprof_html」と「xhprof_lib」が必要で、xhprof_htmlはドキュメントルート内に、xhprof_libはxhprof_htmlと同列のディレクトリ内に設置します。サブドメインを作れるようでしたら、xhprof_htmlをドキュメントルートにした方が良いと思います。

3:テストCakePHP(生け贄)の準備

次に、テスト用のCakePHPを準備します。
方針としては、前回apache benchを行ったときと同様、一番簡単なコントローラとビューを作成し、それを表示したときのベンチマークを観測することにします。

今回は、CakePHP1.2.2.8120版(つまり最新版)で設定を行います。
インストールしたら、とりあえずお約束の、オールグリーンにする作業を行います。
コントローラとビューは、次のものを使います。

[mypages_controller.php]

class MypagesController extends AppController {
  var $name = 'Mypages';
  var $uses = array();

  function index(){
  }
}

[index.ctp]

Hello, CakePHP world.

一応正しく動作することを確認し、debug を0にしておきます。

4:CakePHPのindex.phpにxhprofを適用する

最後に、app/webroot/index.phpを改造し、xhprofを適用します。

~省略~

 * @license       http://www.opensource.org/licenses/mit-license.php The MIT License
 */

// start profiling
xhprof_enable();

/**
 * Use the DS to separate the directories in other defines

~省略~

	if (Configure::read() > 0) {
		echo "";
	}

// stop profiler
$xhprof_data = xhprof_disable();

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

5:プロファイルの取得と表示

以上の設定が完了したら、いよいよCakePHPを起動して、プロファイルを取得します。
エラー等でなければ、最下部にプロファイルを表示するためのリンクが表示されます。

さて、実際に起動した結果を貼り付けてみます。
もの凄~くでかい画像ファイルですのでご了承ください。

xhprof_cakephp

そして、xhprofの目玉である、ダイアグラム表示はこちら!

callgraph_cakephp

こう表にしてみても、やはりApp::import()がらみはやはり重いですね。一目瞭然です。
あと、session関連が重いのは意外でした。まあこれは基本料金みたいなもので仕方ないですか。

実際に、各関数の「本当に必要な処理量」がどのくらいか分からないので、チューニングが可能かどうかは分かりませんが、このグラフはかなりチューニングに役立ちそうな気がします。


Tagged as: , ,

2 Comments

  1. XHProfのインストール方法が参考になりました。
    情報提供どうもありがとうございました。