获取当前请求期间发生的所有PHP错误/警告/ ....

Edw*_*ard 12 php error-handling

将指令设置display_errorstrue(error_reporting设置为E_ALL)时会打印当前请求期间发生的所有错误.

由于我在我的PHP代码中发送标题,我得到了更多错误(在发送内容后发送标题是不可能的).

现在我想将错误消息添加到我的页面末尾.在那里,我想展示所有发生的错误(直到那时).不幸的是,error_get_last只返回发生的最后一个错误.

我首先想到set_error_handler可能会解决问题,但我担心我的错误记录不再起作用了:

重要的是要记住,对于error_types指定的错误类型,标准PHP错误处理程序是完全被绕过的,除非回调函数返回FALSE.

除此之外:

下面的错误类型不能与用户定义的函数来处理:E_ERROR,E_PARSE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,最E_STRICT的其中的set_error_han dler()被调用的文件中提出.

但也许他们也没有 error_get_last()

那么有没有办法在输出生成的内容后打印所有错误?

Egg*_*Egg 5

有一个关于这个讨论,在这里这里(其中包括),与后者的名单上第二个答案使用的混合set_error_handler()使用register_shutdown_function()是一个很好的解决方案.


R_U*_*ser 5

提到你的第一个问题

只要:错误处理仍然有效:

回调函数返回FALSE

function myErrorHandler($error_level, $error_message, $error_file, $error_line, $error_context) {
    // Do your stuff here, e.g. saving messages to an array

    // Tell PHP to also run its error handler
    return false;
}
Run Code Online (Sandbox Code Playgroud)

存储所有错误号(在外部数组中$error_list)的一种解决方案可能是:

$error_list = array();

$myErrorHandler = function ($error_level, $error_message, $error_file, $error_line, $error_context) use (&$error_list) {
    $error_list[] = $error_level;
    // Tell PHP to also run its error handler
    return false;
};
// Set your own error handler
$old_error_handler = set_error_handler($myErrorHandler);
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用例外.函数set_error_handler()的注释中有一个很好的例子

另见:

提到你的第二个问题:

正如Egg已经提到:使用register_shutdown_function()是很长的路要走,而在答案代码/sf/answers/511972121/告诉您如何.

但请记住,那

  • 注册关闭和错误处理函数应该是代码中的第一件事(我曾经在配置文件中遇到错误,因为我之后注册了错误处理程序,因此无法正确处理错误).
  • 可能无法正确处理解析错误(请参阅/sf/answers/511972121/中的注释)