如何仅通过电子邮件发送PHP致命错误?

2022-08-30 22:13:12

我正在完善一个相当大的代码。它包含许多一般的警告和通知,这些警告和通知不会影响代码的执行(即:未定义的可变变量,或没有qoutes的数组键)。

我想写一个函数,让我首先专注于致命错误,然后我会打开它,直到不太紧急的警告和通知。我找到了这个代码,但它通过电子邮件发送了每一个小警告通知和错误。

http://net.tutsplus.com/tutorials/php/quick-tip-email-error-logs-to-yourself-with-php/

我如何修改此代码,使其仅处理以下内容:

  • 致命语法错误
  • 未定义的函数
  • 未能包含文件

答案 1

set_error_handler允许您指定用户定义的错误处理函数,以决定如何处理某些(但仅非致命)错误。然后,您可以以您认为必要的任何方式处理特定类型的错误,例如通过电子邮件通知系统管理员,或保存到特定的日志文件。请参阅:PHP 文档了解更多详情。

关于您的请求,您可以采取以下方法:

function myErrorHandler($errno, $errstr, $errfile, $errline)
{
  if (!(error_reporting() & $errno)) {
    // This error code is not included in error_reporting
    return;
  }

  switch ($errno) {
    case E_USER_ERROR:
    case E_ERROR:
    case E_COMPILE_ERROR:
      echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
      echo "  Fatal error on line $errline in file $errfile";
      echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
      echo "Aborting...<br />\n";
      emailErrorFunction($errno,$erstr,$errfile,$errline);
      exit(1);
      break;

  default:
      echo "Unknown error type: [$errno] $errstr<br />\n";
      break;
  }

/* Don't execute PHP internal error handler */
  return true;
}
// Report all errors
error_reporting(E_ALL);
// User a custom error handler to print output
set_error_handler( 'myErrorHandler' );

由于该错误处理不适用于致命错误(解析错误,未定义的函数等),因此您需要将其与register_shutdown_function,如相关问题中所述:


答案 2

警报性地,您可以使用(如果您具有 shell 访问权限)日志观察程序 shell 脚本。这允许捕获任何错误,包括解析错误(您无法通过register_shutdown_function捕获)。

#!/bin/bash
tail -f /path_to_error_log/php_error.log|while read LINE;do
if grep -q "PHP (Parse|Fatal) error" <(echo $LINE); then
(
echo "From: server@example.com"
echo "To: me@example.com"
echo "Subject: PHP Error"
echo $LINE
) | sendmail -t
fi
done

恕我直言,这是无害的,因为这只是一个副过程,并允许您依赖其他技术(shell脚本或其他),以防由于php环境本身而发生错误,您仍然会收到通知。


推荐