我的最终目标是能够正确记录“致命”错误,遗憾的是set_error_handler
.
目前,PHP 所做的只是记录:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65011744 bytes) in blablabla.php on line 27
这种日志几乎没有用,因为它只告诉我它死的最后一个“点”。这就是为什么我使用自定义错误处理程序来记录“所有”错误debug_backtrace()
。但是由于set_error_handler
没有“得到”致命错误,我(在 Stack Exchange 上)发现了一种处理这些错误的所谓方法,方法是注册一个“关闭函数”来检查最后一个错误,生成debug_backtrace()
并记录它。
可悲的是,当我尝试时,它debug_backtrace()
似乎非常有限,根本不包括所有“步骤”。例子:
function handle_critical_errors()
{
$error_data = error_get_last();
var_dump($error_data);
var_dump(debug_backtrace());
}
function shutdown_handler_function()
{
handle_critical_errors();
}
register_shutdown_function('shutdown_handler_function');
function nonbroken_function()
{
broken_function();
}
function broken_function()
{
$buffer = '';
for ($i = 0; $i < 999999999999999; $i++)
$buffer .= 'this is intended to exhaust all availabile memory because trigger_error doesn\'t let me trigger a fatal error for unknown reasons';
}
nonbroken_function();
当我运行它时,输出如下:
array(4) {
["type"]=>
int(1)
["message"]=>
string(83) "Allowed memory size of 134217728 bytes exhausted (tried to allocate 65011744 bytes)"
["file"]=>
string(54) "blablablabla.php"
["line"]=>
int(27)
}
array(2) {
[0]=>
array(4) {
["file"]=>
string(54) "blablablabla.php"
["line"]=>
int(12)
["function"]=>
string(22) "handle_critical_errors"
["args"]=>
array(0) {
}
}
[1]=>
array(2) {
["function"]=>
string(25) "shutdown_handler_function"
["args"]=>
array(0) {
}
}
}
没有提到broken_function()
or nonbroken_function()
,即使这些被调用了。我不明白。尽管在这个最小的测试/示例中导致致命错误的原因很明显,但在“现实世界”中从来没有或很少出现这种情况,它只会指向我复杂系统中某处的通用线和唯一的“回溯" 仅由关闭处理函数和错误处理函数组成。没有真正的“背景”。我不明白我做错了什么。
此外,我不明白error_get_last()
开始的意义,因为 PHP 在默认情况下会记录 FATAL 错误,但是即使我使用回溯函数,也不会显示任何上下文。
我已经重新阅读了有关该debug_backtrace
功能的手册,但它几乎没有说明什么是回溯。我以为我明白它是什么,但显然,我不明白?
“截止”回溯是否可能与这是一个致命错误这一事实有关,这甚至使基本功能也无法正常运行?如果是这种情况,这是否意味着如果没有纯粹的猜测/手动计算代码,就不可能正确记录(并因此调试)致命错误?