PHP 8.5: PHP 致命错误的堆栈跟踪支持
PHP 7.0 中最具影响力的变化之一是,它将几个 PHP 错误条件移动到抛出 Error
异常,而不是触发致命错误。类型错误、语法错误和其他几种类型的错误是现代 PHP 版本中的异常。
PHP 还支持设置自定义错误处理程序,因此也可以记录某些错误,如弃用通知、警告和其他通知。
然而,PHP 仍然存在某些不可恢复的错误情况,这些情况只是显示错误消息并立即退出(如果 register_shutdown_function
函数中有一个设置,则在调用 shutdown 函数后,可以在该阶段调用它)。
ini_set('memory_limit', '2M');
function my_heavy_function(): void {
$str = str_repeat('A', 1024 * 1024 * 5);
}
my_heavy_function();
上述代码会导致致命错误,因为它将 memory_limit
设置为 2M,而 my_heavy_function()
函数消耗的内存超过了该限制。
在 PHP 8.5 之前,PHP 将会输出以下信息并终止:
Fatal error: Allowed memory size of 2097152 bytes exhausted (tried to allocate 5242912 bytes) in ... on line ...
尽管错误消息中提到了发生错误的文件名和行号,但它缺少堆栈跟踪。如果没有堆栈跟踪,就很难跟踪指向脚本中该行的调用方者。
PHP 8.5 添加了一个新功能,使致命错误消息包含完整的堆栈跟踪:
Fatal error: Allowed memory size of 2097152 bytes exhausted (tried to allocate 5242912 bytes) in /mnt/w/localhost/test/php85/error_handlers.php on line 6
Stack trace:
#0 file.php(...): str_repeat('A', 5242880)
#1 file.php(...): my_heavy_function()
#2 {main}
新增 fatal_error_backtraces
INI 指令
新增的致命错误堆栈跟踪默认是启用的,可以使用新的 fatal_error_backtracks
INI指令进行切换。
例如,要关闭致命错误回溯,请按如下所示设置 INI 指令:
fatal_error_backtraces = Off
兼容其他错误处理控制
新的致命错误回溯功能也可以与其他 INI 指令一起使用。
- 使用 INI
display_errors=Off
时,错误消息现在显示在屏幕上;回溯则不会显示。 - 带有
#[\SensitiveParameter]
的参数不会显示传递给该参数的参数的内容。 - 对于 INI
zend.exception_ignore_args
,回溯不包含传递的参数。
向后兼容性影响
该特性不会引入任何后向兼容性问题。
设置 INI fatal_error_backtraces = Off
将关闭该特性。但是,请注意,使用 display_errors=Off
关闭错误显示是保护生产系统免受内部信息泄露的推荐方法。