【问题标题】:Is it possible to catch all PHP errors occured in a file是否可以捕获文件中发生的所有 PHP 错误
【发布时间】:2012-07-08 22:22:40
【问题描述】:

我想捕获页面中的所有 PHP 错误(E_ERROR、E_WARNING、E_NOTICE、..)并将其记录到 MongoDB 以便更好地阅读和评论它。

我找到了一种使用“error_get_last”捕获最后发生的错误并使用“register_shutdown_function”将其发送到我想要的任何地方Handle fatal errors in PHP using register_shutdown_function()

但是如果我的文件有多个错误,例如警告和通知,我如何才能在一个文件中获取所有错误?这可能吗?我需要的是'error_get_all'之类的东西。

在这里你可以找到我的代码,这个代码有一个致命错误,两个警告和一个通知:

function shutdown() {
  $error = error_get_last();
  if ($error['type'] === E_ERROR || $error['type'] === E_WARNING || $error['type'] === E_NOTICE) {
    var_dump($error);
  }
}

register_shutdown_function('shutdown');

spl_autoload_register('foo');

$x = 5;
$y = 0;

echo 'x/y: ' . $x / $y . '<br/>';

foreach ($noarray as $noelement) {
  echo 'no element: ' . $noelement . '<br/>';
}

【问题讨论】:

    标签: php error-handling


    【解决方案1】:

    为了捕捉致命错误和解析错误,您正在使用正确的功能

    register_shutdown_function
    

    但是当应用程序遇到致命错误,或解析或任何错误 E_ERROR 执行过程在脚本的该点结束,因此在这种情况下,您只能在脚本中捕获一个这样的错误。

    我建议您使用register_shutdown_function 以防万一捕获致命错误,并使用函数set_error_handler 捕获其他错误以捕获其他错误作为警告等,对于异常set_exception_handler,您可以轻松跟踪所有错误在系统中并验证它们。

    如果您将编写对象进行错误处理,那么您的逻辑可以是:

    $handler = new Handler();
    $handler->handleExceptions(); //using set_exception_handler exceptions
    $handler->handleError(E_ALL); //using set_error_handler all other errors
    $handler->handleShutdown(); //using register_shutdown_function fatals, parsing
    

    您将可以选择关闭/打开错误并将错误存储在您需要的地方或通过电子邮件从一个地方发送,这也是获取完整错误以进行调试的简单方法。

    【讨论】:

      【解决方案2】:

      无法捕获超过第一个遇到的致命错误,因为 PHP 解释器永远不会到达它们(脚本在执行您的关闭处理程序后终止)。可以捕获非致命错误(除了关闭处理程序之外,您还需要为它们安装单独的error_handler),PHP 不会终止脚本,因此如果您也不在错误处理程序中终止它,执行将在每个非致命错误后继续,您将全部捕获。如果您仍想在整个文件执行后终止,您可能希望在某处保留一个标志,在包含文件之前清除它并在出现错误时引发它;包含文件后,您可以测试此标志并查看是否发现任何错误。请记住,包含的文件将在该点完全执行(如果它没有任何致命错误),或者您可能永远不会到达该点(如果它有致命错误)。

      如果您正在运行不受信任的用户代码,您可能会对Runkit Sandboxes 感兴趣。您还可以查看 runkit_lint_file() 进行一些预包含验证。

      【讨论】:

        【解决方案3】:

        答案是结合解决方案:

        使用“set_error_handler”捕获所有可能的错误(请参阅http://php.net/manual/en/function.set-error-handler.php),以及使用描述的 register_shutdown_function 记录由此遗漏的错误。

        通过这样做,运行时期间的非致命错误将被自定义处理程序捕获,一直持续到脚本结束或发生致命错误,该错误将被自定义或关闭函数根据类型捕获。

        【讨论】:

        • 感谢@lng,结合 register_shutdown_function 和 set_error_handler 解决了我的问题。
        【解决方案4】:

        您可能想使用这样的框架: http://code.google.com/p/lagger/

        【讨论】:

          【解决方案5】:

          使用set_error_handler

          以下错误类型无法用用户定义的方式处理 功能:E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、 E_COMPILE_ERROR、E_COMPILE_WARNING 和大部分 E_STRICT 在 调用 set_error_handler() 的文件。

          【讨论】:

          • set_error_handler 没有解决我的问题,我需要做的是处理 PHP 定义的错误类型。带有 error_get_last 的 shutdown_register_function 可以处理最后一个错误,但不是所有的错误都在一个文件中。
          • 你是什么意思? PHP 将在第一个错误时停止
          猜你喜欢
          • 2012-07-12
          • 2011-06-18
          • 1970-01-01
          • 1970-01-01
          • 2019-04-02
          • 1970-01-01
          • 2023-04-01
          • 1970-01-01
          相关资源
          最近更新 更多