FirePHP enables you to log to your Firebug Console using a simple PHP method call.

WebサイトやWebアプリケーションを開発する言語としてPHPは人気がある。世界最大規模のソーシャルネットワークサービスFacebookもサービスの開発にはPHPを採用している。提供するサービスが大規模になると一部をC/C++化して高速化をはかることもあるが、開発エンジニアの集めやすさやアジャイル性の良さもあって主要言語のひとつであり続けている。

HTML/CSS/JavaScriptをベースにWebサイトやWebアプリケーションを開発する場合、開発ツールとしてFirebugやブラウザベンダが提供しているデバッグツールが利用できるが、PHPのようにサーバサイドで動作するタイプの言語ではそう簡単にはいかない。しかしいくつか便利なツールがある。ここではFirebugでPHPのデバッグ情報が閲覧可能になるツール「FirePHP」を紹介する。

FirePHPとは

FirePHPはFirebugにインストールするタイプのFirefoxエクステンション。サーバサイドで動作するPHPのログをFirebugのコンソールに出力させるというもの。情報をHTTPレスポンスヘッダに含める形で動作するため、コンテンツには影響を与えないという特徴がある。動作にはサーバ側にFirePHPライブラリのインストールと、PHPコードにログコードの挿入が必要になる。

1. FirePHPインストール

FirePHP - Firebug Extension for AJAX DevelopmentからFirePHPエクステンションとサーバサイド向けのライブラリをダウンロードしてインストールする。FirePHPエクステンションをインストールすると、Firebugのアイコンの横に青色のFirePHPのアイコンが表示されるようになる。PHPコード側には「require_once('FirePHPCore/fb.php');」を先頭に挿入し、あとはFirePHP - Firebug Extension for AJAX Developmentの説明を参考にコードを挿入すればいい。オブジェクト指向ベースのAPIと、簡単に扱えるようにラッピングされたAPIの2種類がある。手軽に使いたいなら後者を使う。

2. グループ化とログ

FirePHPの基本的な使い方はFB::log()でログを出力することにある。ログはFB::group()とFB::groupEnd()で囲むことでグルーピングが可能。グルーピングはネストすることもできる。ただログを出力するよりも、グループとしてまとめて出力した方が便利。

基本的なログ出力とグループ化

HTTPレスポンスヘッダに情報が含められていることがわかる

<?php
require_once('FirePHPCore/fb.php');


FB::group('firephp group and log demo 01');
FB::log('message here 01','message label 01');
FB::log('message here 02','message label 02');
FB::groupEnd();


FB::group('firephp group and log demo 02');
FB::log('message here 03','message label 01');
FB::log('message here 04','message label 02');
FB::groupEnd();
?>

3. ログ、インフォ、ワーニング、エラー

ログ、インフォ、ワーニング、エラーはそれぞれ違った出力となる

FB::log()はメッセージを出力することに利用できる。これ以外にもinfo()、warn()、error()が用意されており、それぞれFirebugコンソールでの出力が変わるようになっている。使い方はlog()と同じ。ラベルとメッセージを引数に与えて呼び出せばいい。

<?php
require_once('FirePHPCore/fb.php');
FB::group('firephp logging demo');
FB::log('message here 01','message label 01');
FB::info('message here 02','message label 02');
FB::warn('message here 03','message label 03');
FB::error('message here 04','message label 04');
FB::groupEnd();
?>

4. テーブルログ

テーブルデータは専用にFB::table()という出力関数が用意されている。配列になにが入っているのかがまとめて、しかもわかりやすい状態で表示されるため便利。まとめて情報を出力させたい場合にも利用できる。

<?php
require_once('FirePHPCore/fb.php');
FB::group('table output demo');
$table   = array();
$table[] = array('head01','head02','head03');
$table[] = array('11','12','13');
$table[] = array('21','22','23');
$table[] = array('21','22','23');
FB::table('table output', $table);
FB::groupEnd();
?>
テーブルデータは専用に出力関数が用意されている

5. トレース情報

トレース情報を出力

FB::trace()を利用するとそのコードがある行数やどの関数を経由してコールされたかを表示させることができる。どこまでトレースするかはsetOptions()経由で設定可能。デバッグするにあたって便利な機能。

<?php
require_once('FirePHPCore/fb.php');
function traceTest()
{
    FB::group('trace demo');
    FB::trace('traceTest function info');
    FB::groupEnd();
}
function traceTestWrap()
{
     traceTest();
}
function traceTestWrapWrap()
{
     traceTestWrap();
}
traceTestWrapWrap();
?>

6. デバッグ切り替え

setEnabled()で実行するかどうかを切り替えることが可能

FirePHPは便利な機能だが、本番環境にデプロイすると誤ってセンシティブな情報を渡してしまうというヒューマンエラーを起こす可能性がある。本番環境にデプロイする段階ではデバックコードは削除した方がいい。FD::setEnabled()でそもそも実行するかどうかを切り替えることができる。デバッグ中であればこの機能をつかって出力させたり止めたりを制御する方法も便利。

<?php
require_once('FirePHPCore/fb.php');
FB::setEnabled(false);
FB::group('firephp group and log demo 01');
FB::log('message here 01','message label 01');
FB::log('message here 02','message label 02');
FB::groupEnd();


FB::setEnabled(true);
FB::group('firephp group and log demo 02');
FB::log('message here 03','message label 01');
FB::log('message here 04','message label 02');
FB::groupEnd();
?>

現在はFirePHPとして開発が進められているが、2010年にはFirePHP 1.0がFireConsoleと名前を変えてリリースされる計画になっている。FireConsoleは最新のFirefoxとFirebugの性能を発揮できるように作り替えが進められているバージョンだと説明がある。