Zend_Db_Profiler_Firebugを使ってみた

http://framework.zend.com/manual/ja/zend.db.profiler.html
マニュアルはここ。

ZF1.6系から、Zend_Db_Profiler_Firebugというコンポーネントが入りました。
これはFireFoxのアドオンであるFireBug, FirePHPを使用して、Zend_Dbで発行したクエリの詳細(生クエリ、実行時間など)を得る事ができます。

Zend_Db_Tableの設定が間違ってないか、とか、ベンチマーク取ったりするのに色々役立つかと思います。

マニュアルにはFrontControllerで簡単に設定できる方法が書かれていますが、今回書くのはFrontControllerを使わない方法です。

実行確認環境

ZF 1.6.2 (1.6.1では動きません)
FireFox 3.0.3
FireBug 1.2.1
FirePHP 0.2.1

実行方法

Zend_Dbオブジェクトを生成する箇所に、以下のコードを一緒に記述します。
<?php

$profiler = new Zend_Db_Profiler_Firebug('All DB Queries');
$profiler->setEnabled(true);
$db->setProfiler($profiler);

テスト環境の時だけ実行されるようにしておくと良いと思います。

次に実際に調べたいオブジェクトを使用した後に記述します。

以下の様なコードがあった場合、

<?php

$rows = $table->fetchAll(
    $table->select()
        ->from($table['hoge'], array('fuga', 'piyo'))
        ->where('fuga= ?', $fugafuga)
        ->where('piyo = ?', $piyopiyo)
);

次の様な感じに記述します。

<?php

$request = new Zend_Controller_Request_Http();
$response = new Zend_Controller_Response_Http();
$channel = Zend_Wildfire_Channel_HttpHeaders::getInstance();
$channel->setRequest($request);
$channel->setResponse($response);
// 出力バッファリング開始
ob_start();

//////先ほどのZendDbTableオブジェクト//////

// データをブラウザに送信
$channel->flush();
$response->sendHeaders();
FirePHPの設定をしておきます。

FirePHPアイコンをクリックして出てくるメニューより、

「FirePHP Enabled」をチェック。
「Allowed Sites」に、テストを実行しているホスト名を入力。

以上で、クエリが実行される度にFireBugコンソールに解析結果が表示されると思います。

アクションヘルパーに…

これを簡単に使える様にアクションヘルパーにしてみました。(ほんとに簡単ですが…)

  • Zend_Controller_Action_Helper_Db_ProfilerFirebug.php

■codecheck.inにもコミットしています。

<?php

/**
 * CustomActionHelper/Zend_Controller_Action_Helper_Db_ProfilerFirebug
 *
 * @uses      Zend_Controller_Action_Helper_Abstract
 * @author    taketin
 */

/**
 * 簡単Firebugプロファイラー
 */
class Zend_Controller_Action_Helper_Db_ProfilerFirebug extends Zend_Controller_Action_Helper_Abstract
{

    /**
     * プロファイル実行
     * @param object $zendDbTable Zend_Db_Tableオブジェクト
     * @access public static
     */
    public static function getProfile($zendDbTable)
    {

        $request  = new Zend_Controller_Request_Http();
        $response = new Zend_Controller_Response_Http();
        $channel  = Zend_Wildfire_Channel_HttpHeaders::getInstance();
        $channel->setRequest($request);
        $channel->setResponse($response);

        // バッファリング開始
        ob_start();

        $zendDbTable;

        // データをブラウザに送信
        $channel->flush();
        $response->sendHeaders();

        return;

    }

    /**
     * ダイレクトメソッド
     * @param object $zendDbTable Zend_Db_Tableオブジェクト
     * @access public
     */
    public function direct($zendDbTable)
    {

        return $this->getProfile($zendDbTable);

    }

}

使用法

※ZendDbTableのオブジェクトが $rows に入っているとします。

:アクションコントローラーを保持してる場所で使うのであれば、フロントコントローラーにて、

<?php

Zend_Controller_Action_HelperBroker::addPrefix('Zend_Controller_Action_Helper_Db');

等と設定してもらって、

<?php

$this->_helper->profilerfirebug($rows);

でOKです。($thisはアクションコントローラーオブジェクトとします)

アクションコントローラーを保持していないモデル内等で使う場合は、

先ほどのZend_Controller_Action_Helper_Db_ProfilerFirebugクラスをrequireしといて、

<?php

Zend_Controller_Action_Helper_Db_ProfilerFirebug::getProfile($rows);

でOKです。


一つのZendDbTableオブジェクトを使って何度かセレクトしたりする場面では、全ての操作が終わった後のZendDbTableオブジェクトを一回調べれば、それまでに行ったクエリの結果が全て取得表示できるようです。

まだSELECTしか試してないので、INSERT, UPDATE, DELETE等の動作検証はしていません。

…というか、専用のメソッドとかもあるみたいですね(マニュアル見直さなければ)