« Services_TechnoratiでTechonoratiを使い倒そう | メイン | Firefox 2 RC2 を使ってみる - 対応していない拡張機能も強引に使えるようにする方法 »

php で 簡単にデバッグする方法
このエントリーをブックマークに追加 このエントリーをlivedoorクリップに追加

尾藤正人です。

Ruby で debug する7つの方法

Perl での print debug の方法の紹介がブーム(?)だったので、自分がよく行ってる Ruby での debug 方法7つについて書いてみます。

ということなので、僕が PHP でやってること書いてみたいと思います。

preprint_r()

print_r() とか var_dump() だと HTML の中に出してブラウザで見るときにすごく見にくくなります。 そこで preprint_r() という関数を定義して、<pre></pre> で囲んで見やすいように出力しています。

function preprint_r(&$var, $title = '')
{
    echo _preprint_r($var, $title);
}

function &_preprint_r(&$var, $title = '')
{
    if (!defined('UNOH_DEV') && UNOH_DEV) {
        return '';
    }

    $html = '<table>';
    if ($title) {
        $html .= "<tr><th align=\"left\">$title:</th></tr>";
    }
    $html .= '<tr><td><pre>';
    $html .= htmlspecialchars(print_r($var, true));
    $html .= "</pre></td></tr></table>\n";

    return $html;
}

preprint_r() では UNOH_DEV が定義されているかどうかチェックしています。 開発版の場合は UNOH_DEV が必ず定義されているので、もし仮にデバッグで入れた preprint_r() がプログラムに残った状態でコミットされても、本番環境で表示されないようにしています。

実はこの preprint_r() という関数は前職の HDE にいた頃に覚えました。 大変便利なので、僕はいつもこの関数を定義して使うようにしています。

preprint_r smarty plugin

smarty の中でも使いたいということで preprint_r smarty plugin も作っています。

function smarty_function_preprint_r($params, &$smarty)
{
    if (empty($params['var'])) {
        $smarty->trigger_error("preprint_r: missing 'var' parameter");
        return;
    }

    $title = isset($params['title']) ? $params['title'] : '';
    return _preprint_r($params['var'], $title);
}
smartyテンプレートの中で
{preprint_r var=$hoge}

という風に書くと変数がダンプされて表示されます。

set_error_handler() でエラーが起きた時にメールを送信する

PHP ではエラーが起きた時にどういう処理を行うかを set_error_handler() を使って変更することができます。 フォト蔵ではエラーが起きた時にメールで送信するようになっていて、エラータイプ、エラーメッセージ、エラーが起きたファイル、行数、URI、$_SERVER, $_COOKIE とかの変数のダンプ、バックトレース等、デバッグに必要な情報を送信しています。

ウノウでは開発者毎にバーチャルドメインをきって開発環境が独立しているので、個人の開発環境で起こったエラーは個人に送るようにしていて、本番環境で起こったエラーに関してはみんなに送信するようにしています。

xdebug を使う

xdebug にはいろいろ機能がありそうですが、プロファイラーにしか使ってません。

プログラムの最後に

preprint_r(xdebug_get_profiler_filename(), 'profile');
という風に書いておくと
/home/masato/photo/var/xdebug/cachegrind.out.573339192

こんな感じでプロファイルの情報が入っているファイル名が表示されます。これをプロファイラで表示してやれば、どの処理にどれくらい時間がかかってるのかがすぐ分かるようになります。

僕は WinCacheGrindというソフトウェアを使ってます。ホームディレクトリを samba で共有しているので、Windows からそのままファイルを開くだけで大丈夫です。

他に

こんな方法使ってるよっていうのがありましたら、ぜひ教えてください!!

トラックバック

このエントリーのトラックバックURL:
http://www.unoh.net/mt32/mt-tb.cgi/363

この一覧は、次のエントリーを参照しています: php で 簡単にデバッグする方法:

» PHPのデバッグ方法 from Moony::log
「ウノウラボ Unoh Labs: php で 簡単にデバッグする方法」につられて書いてみる。 開発時はxdebugをPHP環境に組み込んでいるので、特... [詳しくはこちら]

» [PHP] php で 簡単にデバッグする方法 from oooooooo
php で 簡単にデバッグする方法 http://labs.unoh.net/2006/10/php_print_debug.html print_r(... [詳しくはこちら]

» set_error_handler関数 from あんじーのテクニカルブログ
オレンジニュースを見ていたら、PHPにも致命的なエラーに対するハンドリングする方... [詳しくはこちら]

» PHPで簡単にデバッグする方法 from Shoulder.jp
ウノウラボさんにてPHPで簡単にデバッグする方法が書いてあった。 php で 簡... [詳しくはこちら]

» PHP from Happy Engineer Life (PukiWiki/TrackBack 0.3)
Tag: PHP PHP マニュアル 開発環境 入門 テスト テクニック PHP5 フレームワーク サンプル集 パフォーマンスチューニング PEAR コ... [詳しくはこちら]

コメント

私は,以下の print_a() をカスタマイズして使っています.
http://www.atomar.de/public/code/debuglib/debuglib.demo.php

あとは,dBug というのもありますね.
http://dbug.ospinto.com/

ありがとうございます。
print_a() というのがあったのは知りませんでした。

dBug は以前から知ってて使ったことがあったのですが、dBug ってインクルードすると勝手に HTML タグを吐き出すので、困ってすぐにやめてしまいました。

私はPEAR::Var_Dumpを使ってます。
出力形式を選べるので便利です。

PEAR::Var_Dump って本番環境で間違って出力するのを防ぐために、何かフラグがたってたら出力しなくするような機能ってありますか?
なければいずれにせよラップして使わないとダメですね。

コメントを投稿


画像の中に見える文字を入力してください。