SQL Explain component for the Debugkit UPDATE
CakePHP 1.2.2をさっそく利用してます。
Debugkit版SQL Explainの使い方の一つを書き忘れたので書いておきます。
遅いSQLクエリだけExplainしたい場合は、debugkit/controllers/components/toolbar.phpに記述している、sqlExplainPanelクラスの中の、
var $slowQueryThreshold = 0;
の値を変えてください。これを例えば3にすると3秒以上かかったクエリだけExplainします。
SQL Explain for debugkitをいくつか修正したのと、本家debug kitがいくつか修正されてたので、その修正を取り込みました。
ファイルはここからzipをダウンロードするか(ダウンロード前にページの再読み込みを念のためして下さい)、下記thechaw.comからgitでダウンロードしてください。
http://thechaw.com/forks/ichikaway/debug_kit
変更履歴は下記で見れます。
http://thechaw.com/forks/ichikaway/debug_kit/timeline/type:commits
具体的な変更箇所は、複数のDBを使ってる時(例えばSelectを投げるDBが複数ある時)、app/config/database.phpに複数のDATABASE_CONFIGを記載し、コントローラなどで
$this->Model->setDataSource('default2');
みたいにして切り替えてると思うのですが、そのような場合にもSQL Explainし、その結果をhtmlのテーブルを分けて表示します(下記画像)
複数のDBがMySQLとPostgreSQL混在してても対応してます(かなりレアケースだと思いますが)
あとは、Debugkitを開発しているMark Storyに、private propertyを直接参照してるからルール違反じゃないの?と言われたので、別の方法に変更しました。
具体的には、DboSource::showLog()で出力したhtmlタグが付いているSQLクエリを取得し、それを配列に変換して、SQLクエリだけ取り出す方法にしました。下記のリンク先でmcurryがやってる方法そのままです。
http://github.com/mcurry/cakephp/tree/master/plugins/sql_log
具体的なコードだけ抽出すると
App::import('Core', 'Xml'); ob_start(); $db->showLog(); $queryLogs[$configName] = ob_get_clean(); $Xml = new Xml($queryLogs[$configName]); $logs = $Xml->toArray(); $logs = Set::classicExtract($logs, 'Table.Tbody.Tr.{n}.Td');
です。
XMLクラスのtoArray()はかなり最強!htmlのテーブルタグを取り除いて配列構造に変換してくれる!!
そして、SetクラスのclassicExtractはその配列構造から必要な深さの配列だけを抽出してくれる。
この組み合わせ、すごい!
わざわざhtml出力をした結果に対してhtmlタグ除去してるので、この実装はなんだか遠回りしてる気がしてなりませんが。。。