WEBアプリケーション研究室 開発ノート TOP

WEBアプリケーション研究室 開発ノート [Zend Framwork]複数のZend_Db_Profilerを細かく使い分ける

スポンサーサイト

-------- --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

    このエントリーをはてなブックマークに追加

phpunitを使ってユニットテストを行いながら開発をしています。データーベース関連のテストで、クエリの数を数えたかったのですが、そのまま使うと、他のテストで発行したクエリまで数えてしまいます。そこで、問題のテストの最初で新しいZend_Db_Profilerのオブジェクトをセットしてやると、新規でログをとり始めるので、うまくできました。


$db = $select->getAdapter();
$old_prof = $db->getProfiler();
$db->setProfiler(new Zend_Db_Profiler(true));

//ここでDBにクエリを発行していろいろ実行

$prof = $db->getProfiler();
$prof->setFilterQueryType(Zend_Db_Profiler::SELECT);
$this->assertTrue(1 == $prof->getTotalNumQueries());
$db->setProfiler($old_prof);
これで、今回のクエリーだけカウントが取れます。ただ、全体のログから、今回のログが除かれてしまいます。戻せそうだなあと思い、コードを追ってみた結果、これを$old_profに戻すのはZend_Db_Profilerでは難しそうです。

//↑の$db->setProfiler($old_prof);の前で
foreach($prof->getQueryProfiles(Zend_Db_Profiler::SELECT) as $query)
{
$id = $old_prof->queryClone($query);
$old_prof->queryEnd($id);
}
$db->setProfiler($old_prof);
これで、一応戻せます。しかし実行時間がおかしなことになります。問題なのはクエリを外から加えるメソッドがqueryCloneしかなく、Zend_Db_Profiler_Queryはcloneの中でかかった時間をクリアしています。で、queryEndで終了させてやれば出るのですが、実行時間がqueryCloneを実行してからqueryEndが実行されるまでの時間になってしまいます。
現状ではZend_Db_Profilerを継承したクラスを作ってクエリリストにそのまま、加えられるようにしないとだめそうです。
スポンサーサイト

    このエントリーをはてなブックマークに追加
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。