PHPでエラーを非表示にした状態でエラーハンドリングする

2016-02-05

PHPでエラーを非表示にした状態でエラーハンドリングする

このエントリーをはてなブックマークに追加

エラーが出た時でもそのまま出力されがちなPHPのエラーを非表示にしつつうまくハンドリングしたい時のスニペット  

今回はini_setでエラーを非表示にした上で「set_error_handler」を使ってエラーを受け取り、エラーがあれば指定アドレスにメールを飛ばすようにする  

ini_set("display_errors", 0);
ini_set("display_startup_errors", 0);

set_error_handler(function($errCode, $errStr, $errFile, $errLine, $errContext) {

    $errContext = print_r($errContext, true);
    $message = <<<_TEXT
    Error Reporting
    errCode:\t{$errCode}
    errStr:\t{$errStr}
    errFile:\t{$errFile}
    errLine:\t{$errLine}
    errContext:\t{$errContext}
    _TEXT;
    // 送信先
    $to = 'example@example.com';
    // 差出人
    $from = 'example@example.com';
    // 件名
    $subject = 'エラーが発生しました';
    // ヘッダー
    $header = "From: {$from}\r\n";
    // 本文
    $body = $message;

    //送信処理
    mb_send_mail($to, $subject, $body, $header);

}, E_WARNING);

「set_error_handler」の第2引数では、受け取りたいエラーのレベルを指定できる  

例えばnoticeレベルのエラーが受け取りたいときは「E_WARNING」を「E_NOTICE」に変更すればいい。  

一番便利なのは$errContextの引数で、変数や配列の内容をすべて出力してくれる(その分ログは長くなるが・・・)  

今回はメールで送信してるが、ログファイルなどに出力してもいいと思う