gpt4 book ai didi

PHP:记录生产中 fatal error 的堆栈跟踪

转载 作者:可可西里 更新时间:2023-11-01 12:32:57 24 4
gpt4 key购买 nike

我想记录每一个 fatal error ,甚至是超时和其他 E_ERRORS 错误。我使用 set_error_handler 和 shutdown 函数,但最后一个函数我无法获得堆栈跟踪。有什么办法可以得到吗?

我想在生产服务器上记录 fatal error ,以帮助解决仅在生产中出现的错误。我知道,开发服务器上的 xdebug 一定足够了,但事实并非如此。也许我们可以使用激活了最少选项的 xdebug,或者它的剥离版本来将堆栈跟踪添加到错误日志中?

如果发生错误,甚至超时,此代码将打印错误信息。

<?php
function shutdown()
{
$a=error_get_last();
if($a!==null) print_r($a);
}
register_shutdown_function('shutdown');

最佳答案

您不会获得有关 fatal error 的堆栈跟踪,因为“致命”意味着脚本执行立即停止,即无法通过常规 channel 生成跟踪。因此,如果您已将自定义错误处理程序设置为抛出异常,则不会根据 PHP manual 为 fatal error 调用它。 :

The following error types cannot be handled with a user defined function: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT raised in the file where set_error_handler() is called.

获取有关 fatal error 中发生的事情的信息的最简单方法(除了打开 display_errors,这在生产环境中不是一个选项)是在关机处理程序。此外,我不会在生产服务器上使用 xdebug ...它用于调试您的开发环境,并且会在生产环境中增加不必要的开销。

因此,修改您的关闭处理程序,您可以执行如下操作:

function shutdown()
{
if ( ! $err = error_get_last()) {
return;
}

$fatals = array(
E_USER_ERROR => 'Fatal Error',
E_ERROR => 'Fatal Error',
E_PARSE => 'Parse Error',
E_CORE_ERROR => 'Core Error',
E_CORE_WARNING => 'Core Warning',
E_COMPILE_ERROR => 'Compile Error',
E_COMPILE_WARNING => 'Compile Warning'
);

if (isset($fatals[$err['type']])) {
$msg = $fatals[$err['type']] . ': ' . $err['message'] . ' in ';
$msg.= $err['file'] . ' on line ' . $err['line'];
error_log($msg);
}
}

关于PHP:记录生产中 fatal error 的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8990881/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com