facebook twitter hatena line email

Php/errorメール

提供: 初心者エンジニアの簡易メモ
2017年7月21日 (金) 00:42時点におけるAdmin (トーク | 投稿記録)による版 (メール本文にはこのように表示される)

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索

fatalエラーをキャッチしてメールで送信

  • application/batch/testbatch.php
require_once APPLICATION_PATH . '/models/ErrorMailModel.php';
register_shutdown_function(array('ErrorMailModel', 'fatalHandler'));
set_error_handler(array('ErrorMailModel', "errorHandler"));
$a = $b;
testa();
  • application/models/ErrorMailModel.php
/**
 * エラーメールハンドラクラス
 * @ex
require_once APPLICATION_PATH . '/models/ErrorMailModel.php';
register_shutdown_function(array('ErrorMailModel', 'fatalHandler'));
set_error_handler(array('ErrorMailModel', "errorHandler"));
$a = $b;
testa();
*/
class ErrorMailModel
{
 private static function _getErrorCodeByNo($errno)
 {
   $errcode = "";
   switch ($errno){
   case E_ERROR: // 1 //
     $errcode = 'E_ERROR'; break;
   case E_WARNING: // 2 //
     $errcode = 'E_WARNING'; break;
   case E_PARSE: // 4 //
     $errcode = 'E_PARSE'; break;
   case E_NOTICE: // 8 //
     $errcode = 'E_NOTICE'; break;
   case E_CORE_ERROR: // 16 //
     $errcode = 'E_CORE_ERROR'; break;
   case E_CORE_WARNING: // 32 //
     $errcode = 'E_CORE_WARNING'; break;
   case E_COMPILE_ERROR: // 64 //
     $errcode = 'E_COMPILE_ERROR'; break;
   case E_CORE_WARNING: // 128 //
     $errcode = 'E_COMPILE_WARNING'; break;
   case E_USER_ERROR: // 256 //
     $errcode = 'E_USER_ERROR'; break;
   case E_USER_WARNING: // 512 //
     $errcode = 'E_USER_WARNING'; break;
   case E_USER_NOTICE: // 1024 //
     $errcode = 'E_USER_NOTICE'; break;
   case E_STRICT: // 2048 //
     $errcode = 'E_STRICT'; break;
   case E_RECOVERABLE_ERROR: // 4096 //
     $errcode = 'E_RECOVERABLE_ERROR'; break;
   case E_DEPRECATED: // 8192 //
     $errcode = 'E_DEPRECATED'; break;
   case E_USER_DEPRECATED: // 16384 //
     $errcode = 'E_USER_DEPRECATED'; break;
   }
   return $errcode;
 }
 // fatalエラー検知
 public static function fatalHandler() {
   $error = error_get_last();
   $errcode = self::_getErrorCodeByNo($errno);
   if ($error['type'] === E_ERROR || $error['type'] === E_USER_ERROR || $error['type'] === E_USER_NOTICE) {
     $linemsg = sprintf("[ERROR:%s] [Msg:%s] [File:%s] [Line:%s]\n",
       $errcode, $error['message'], $error['file'], $error['line']);
     $str = "";
     foreach ($_SERVER as $key => $value) {
       if ($key) {
         if (preg_match("/^(SCRIPT_NAME)$/", $key)) {
           $str .= sprintf("%s:%s\n", $key, $value);
         }
       }
     }
     $text = $linemsg. $str;
     // メール処理をここに入れる
   }
 }
 // warningなど検知
 public static function errorHandler($errno, $errstr, $errfile, $errline)
 {
   $errcode = self::_getErrorCodeByNo($errno);
   $linemsg = sprintf("[%s] [Msg:%s] [File:%s] [Line:%s]\n", $errcode, $errstr, $errfile, $errline);
   $headerlog = "";
   $backtraces = debug_backtrace();
   foreach ($backtraces as $key => $trace) {
     if (array_key_exists('file', $trace)
       && array_key_exists('line', $trace)
       && array_key_exists('class', $trace)) {
     $headerlog .= sprintf("#%d %s(%d): %s::%s\n", $key, $trace['file'], $trace['line'], $trace['class'], $trace['function']);
     }
   }
   $text = $linemsg. $headerlog;
   // warningなどは無視
   // メール処理をここに入れる
 }
}

メール本文にはこのように表示される

[ERROR:] [Msg:Call to undefined function testa()] [File:/var/www/zend/example/application/batch/testbatch.php] [Line:8]

メモリ限界エラーが検知できないので以下のようにmemory size~を追加する

if ($error['type'] === E_ERROR || $error['type'] === E_USER_ERROR || $error['type'] === E_USER_NOTICE
    || strpos($error['message'], 'Allowed memory size of') !== false) {
// メモリ限界に達したエラーでもメールできるように
ini_set("memory_limit", "8096M");
〜略 メール送信コード〜

メール処理はzendを利用

php/zend_framework/zend_mail [ショートカット]