Php/errorメール
提供: 初心者エンジニアの簡易メモ
目次
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 [ショートカット]
