エンジニア採用セミナー
エンジニア採用セミナー
2009.12.22

FirePHPを使ってみよう

まっちー

CakePHPで開発をする際、デバッグの値を2とかにするとページの最下部に投げたクエリの結果などが見られる。

これは大変便利なのだけど、作っているサイトのデザインとかによっては見づらかったりするし、意外と邪魔だなって思うこともある。しかしデバッグを0にすると本当に正しいクエリを投げているのか確認できなかったりするから、それはそれで困ってしまう。

なので、できればこの実行結果などを別のところで見られれば良いなぁと思うわけです。

そこで今回オススメしたいのがこちらの商品。FirePHP。
(リンク先はここで良いのかしら?)

FirefoxにはFirebugというアドオンがありますが、このFirePHPをインストールするとFirebugの中でクエリの実行結果などが見られてしまうという、なかなかどうしてたいした商品です。

Firebugが入っていないと見られないので、当然ブラウザもFirefoxを使っているときに限られますが、でもAjaxでデータを読み込んだ場合などもちゃんとデバッグしてくれるので、ぜひ活用していきたい。

今回はこのFirePHPというアドオンに加えて、CakePHPで使うために必要なFirePHP.class.phpファイルもつけて、な、なんと、お値段はタダ。これはお買い得ですね~。

気になる方は今すぐインストール。数に限りはございませんので、お早目にインストールするも良し。しないも良し。

URLはhttps://addons.mozilla.org/ja/firefox/addon/6149です。お間違えのないように。

・・・とまあ、そういうわけで、早速FirePHPをCakePHPで使ってみませう。

まずはFirefoxにFirePHPを入れる。これは上記のリンク先から入れられる。

次に必要なのがFirePHP.class.phpファイル。これはこちらから入手できる。vendorsにFirePHPCoreとかそんな適当な名前のフォルダを作って、その中にFirePHP.class.phpファイルを入れておく。

必要な物資の調達はこれでOK。あとはデバッグ情報がFirebug内で出力されるように設定すれば完了です。

/cake/libs/model/datasources/下にdbo_source.phpというファイルがあるのだけど、これをコピーして、app/model/datasources/に置く。

dbo_source.phpの中を見ると、showLogというファンクションがあるので、その中身をちょっといじる。

いじるのはif(PHP_SPAI != ‘cli’) € { 以下の部分

変更前

if (PHP_SPAI != 'cli') {

 € € € print ("<table class="cake-sql-log" id="cakeSqlLog_" . preg_replace('/[^A-Za-z0-9_]/', '_', uniqid(time(), true)) . "" summary="Cake SQL Log" cellspacing="0" border = "0">n<caption>({$this->configKeyName}) {$this->_queriesCnt} {$text} took {$this->_queriesTime} ms</caption>n");

 € € € print ("<thead>n<tr><th>Nr</th><th>Query</th><th>Error</th><th>Affected</th><th>Num. rows</th><th>Took (ms)</th></tr>n</thead>n<tbody>n");

 € € € foreach($log as $k => $i) {

 € € € € € € € print ("<tr><td>" . ($k + 1) . "</td><td>" . h($i['query']) . "</td><td>{$i['error']}</td><td style = "text-align: right">{$i['affected']}</td><td style = "text-align: right">{$i['numRows']}</td><td style = "text-align: right">{$i['took']}</td></tr>n");

 € € € }

 € € € print ("</tbody></table>n");

} else {

 € € € foreach($log as $k => $i) {

 € € € € € € € print (($k + 1) . ". {$i['query']} {$i['error']}n");

 € € € }

}

変更後

if (PHP_SPAI != 'cli') {

 € € € $summery = "{$this->_queriesCnt}{$text}took{$this->_queriesTime}ms";

 € € € $header = array("Nr", "Query", "Error", "Affected", "Num.rows", "Took(ms)");

 € € € $body = array($header);

 € € € foreach($log as $k => $i) {

 € € € € € € € $row = array(($k+1), $i['query'], $i['error'], $i['affected'], $i['numRows'], $i['took']);

 € € € € € € € $body[] = $row;

 € € € }

 € € € fb(array($summery, $body), FirePHP::TABLE);

} else {

 € € € foreach($log as $k => $i) {

 € € € € € € € pring(($k+1).".{$i['query']}{$i['error']}n);

 € € }

}

何のことやらよく分かりませんが、たぶんページの下に出ていたデバッグ情報をFirebugの中でprintするようにしているのがこの部分なのでしょう。何となくそれっぽいことをしている感じが読み取れるし。

そしたら今度はbootstrap.phpに以下のコードを書く。

ob_start();

App::import('Vendor', 'FirePHP', array('file' => 'FirePHPCore'.DS.'FirePHP.class.php'));

function fb() {

 € € € $instance = FirePHP::getInstance(true);

 € € € $args = func_get_args();

 € € € return call_user_array(array($instance, 'fb'), $args);

 € € € return true;

}

これで全て完了。あとは実際にページを開いてみれば分かる。

Ajaxでdivの中身だけを書き替えたりしたときに、そのdivの中にデバッグ情報が出てくるのが個人的にちょっとあれだったんで、Ajax部分はいつもデバッグを0にしてたんですけど、これなら全部Firebugの中に出力されるから、レイアウトも崩れない。素敵。

ついでにCtrl+F12でFirebugを別ウインドウで開くこともできるから、この組み合わせでさらに見やすくなる。デュアルディスプレイで仕事してる場合には、かなり強力な味方なのではないかなと思います。

CakePHPを使っていると、prでデータの中身を見たりすることはままあると思うのですが、そういうときも

$data = $this->Model->find('all');

fb($data);

みたいにやると、Firebugの方に$dataの中身が表示されます。

こいつは便利。

参考サイトはこちら