CakePHPのDebugKitにプロファイル情報が見れるXHProfPanelを追加

October 10, 2010 - PHP

先日のPHPMatsuriのハッカソンにて作成したXHProfの結果がみれるCustomPanelですが、そのまま公開するにはお恥ずかしい感じだったので、多少マシに改修したものを公開してみます。

DebugKit, XHProfPanelとは

CakePHPのDebugKitというプラグインがあり、それを使えばいろんなデバッグ情報がWeb画面上で確認できます。で、これにXHProfというphp拡張を使ってプロファイラ情報を見れるようにしてみました。

こんな感じです。

で、パネルを開くとこんな感じに各関数呼び出しごとの負荷情報などを閲覧できます。

さらに、"xhprof Result"というリンクをクリックすれば、XHProfが用意してくれているビューアを開くこともできます。ビューアではコールグラフも閲覧できます。

カスタムパネルの追加方法

helloworld_controllerにプロファイル実行する、という例で説明します。

事前準備

debugkitはインストール済みとします。入れ方は
超便利なDebugkitを画面キャプチャ付きで解説 - cakephperの日記(CakePHP, MongoDB, Lithium)
を参照してください。

XHProfのインストールも済ませておきます。

wget http://pecl.php.net/get/xhprof-0.9.2.tgz
pecl install xhprof-0.9.2.tgz

php.iniにも設定追加しておきます。

extension=xhprof.so

tgzファイルをtarで解凍した中身のうち、xhprof_html,xhprof_libをビューア用に用意したバーチャルホスト下において、
別ドメインでアクセスできるようにします。
cakeのアプリはcake.localhost、xhprofビューアはxhprof.localhostのような感じです。
ディレクトリはこんな感じできっています。

/var/
  vhosts/
    cake/ // cake.localhostのdocument_root
      app/
    xhprof/
      xhprof_html/ // xhprof.localhostのdocument_root
      xhprof_lib/

ファイル構成

下記ファイルを修正もしくは新規作成します。

app/
  controllers/
    helloworld_controller.php //新規追加
  plugins/
    debug_kit/
      controllers/
        conmponents/
          toolbar.php //修正
      views/
        elements/
          xhprof_panel.ctp //新規追加

1.XHProfPanelの追加

app/plugins/debug_kit/controllers/components/toolbar.php

に下記クラスをコピペで追加。

2.デフォルトパネルにXHProfPanelを追加

app/plugins/debug_kit/controllers/components/toolbar.php

の既存行(52行目あたり)に下記のように$_defaultPanelsに'xhprof'を追加。

3.controllerの設定にもXHProfPanelを追加

下記のようにXhprofPanelへの設定情報も渡します。

4.テンプレートの追加

app/plugins/debug_kit/views/elements/xhprof_panel.ctp

を下記内容で新規作成します。

ソート順の変更

デフォルトではwall timeの降順でソートしてあります。
コントローラでの設定で'sortBy'の値を変えれば変更できます。
(指定しなければ'wt'指定となります。)
設定できるのはct, wt, cpu, mu, pmuの5つ。

プロファイル範囲

XhprofPanel::__constructからXhprofPanel::beforeRenderまでです。
結果をみるとLogPanelクラス(DebugKitプラグイン内のクラス)のメソッド呼び出しも含まれていたりするので、
もう少し適当な範囲にできないか検討したいと思います。

余談

Githubを有料アカウントにすべきか迷い中です。今回とりあえずgistで公開してみましたが、リポジトリは欲しいような、でも今のところ必要ないような…