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等の動作検証はしていません。
…というか、専用のメソッドとかもあるみたいですね(マニュアル見直さなければ)