ログ日記

作業ログと日記とメモ

運用後のエラーをどうするか

テスト漏れがあった場合、ユーザが利用中にPHPのエラーが起こる。
その場合どうするか考える。


もちろんwebに生のエラーを吐き出してはいけない。


手っ取り早いのが set_error_handler() を使って全てのエラーを捕まえる。
そうしておいてログに書いたりメールを送ったりする。


自分の場合はこんなの。

<?php
...
/**
 * ユーザエラー処理関数
 *
 * @param int $level エラーレベル
 * @param string $msg エラーメッセージ
 * @param string $file 標準エラーから呼ばれたときのエラーファイル名
 * @param string $line 標準エラーから呼ばれたときのエラー行数
 * @param string $text 標準エラーから呼ばれたときのメッセージ
 * @access public
 */
function laizError($level, $msg, $file=null, $line=null, $text=null){
    // @(エラー制御演算子)がついている場合はerror_reportingの値がゼロになる
    $rep = error_reporting();

    $e = LaizErrorUtilsCreator::getInstance();

    $level = $level & $rep;
    $error   = E_ERROR | E_USER_ERROR;
    $warning = E_WARNING | E_USER_WARNING;
    $notice  = E_NOTICE | E_USER_NOTICE;
    $strict  = E_STRICT;

    switch (true){
    case ($level & $error):
        $e->error($msg);
        break;

    case ($level & $warning):
        $e->warning($msg);
        break;

    case ($level & $notice):
        $e->notice($msg);
        break;

    case ($level != 0):
        // キャッチできなかったエラーは標準エラーに引き継ぎ
        return false;
        break;
    }

    return true;
}

// 標準のエラーハンドラを書き換える
set_error_handler('laizError');
error_reporting(E_ALL | E_STRICT);

注意点としては、外部ライブラリが@エラー制御演算子なんかを使っている場合、error_reporting()に応じた処理をしないと大変なことになる。



で、エラー処理クラスの中で http://php.net/debug-backtrace を使って独自にトレース出力をしてるわけだが・・
ここで、関数呼び出しトレースだけでは足りない場合がある。そもそもテスト時に気付かなかったほどのまれなエラーなら、ある特定の状態でしか起こらない可能性が高い。そんなわけでエラーレポートに何情報を出力すればいいのか悩む。


var_export() で引数などを全部出せば大抵のことが分かるが、これだと情報が多すぎて逆に厄介。
現状では取り敢えず$_REQUESTなんかを出力してみて、しばらく様子を見ることにする。