编程

PHP 8.5: PHP 致命错误的堆栈跟踪支持

6 2025-08-11 03:09:00

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 关闭错误显示是保护生产系统免受内部信息泄露的推荐方法。