如何让PHP在出现致命错误时记录堆栈跟踪

php
2022-08-30 14:38:14

我已经将php配置为记录错误,并且在我的开发计算机上,它们在apache错误日志中显示为:

[Thu Mar 17 18:22:07 2011] [error] [client ::1] PHP Parse error:  syntax error, unexpected ')' in /Users/troelskn/Projects/test/bootstrap.inc.php on line 27
[Thu Mar 17 18:22:07 2011] [error] [client ::1] PHP Stack trace:
[Thu Mar 17 18:22:07 2011] [error] [client ::1] PHP   1. {main}() /Users/troelskn/Projects/test/public/index.php:0

但是,在生产计算机 (Ubuntu) 上,错误后没有堆栈跟踪,并且消息中附加了引用站点。例如。它看起来像这样:

[Thu Mar 17 18:22:07 2011] [error] [client ::1] PHP Parse error:  syntax error, unexpected ')' in /Users/troelskn/Projects/test/bootstrap.inc.php on line 27, referer: http://localhost/

如何控制此格式?我非常希望在日志中提供堆栈跟踪。


答案 1

好吧,正如已经指出的那样,您在实时计算机上不会获得相同的格式,因为实时计算机尚未安装xdebug。有debug_backtrace但不会捕获致命错误。

您可以在实时服务器上安装 xdebug,但您必须非常小心地对其进行配置,以便除了堆栈跟踪日志记录之外不公开任何功能。在实时盒子上不谨慎地使用xdebug可能会带来安全风险,因为人们可以启动远程调试会话,或者其增强的错误消息可能会无意中回显出代码的内部细节。

说实话?我认为您最好的选择是尝试重新创建实时服务器记录的错误在测试服务器上发生的情况。

编辑添加:忘记提到除了存在安全风险外,xDebug还会对您的网站性能产生负面影响。它以几种关键方式挂接到Zend Engine,以记录程序状态并改变其行为(例如覆盖@错误抑制),这将不可避免地对性能产生影响。基本上,尝试在测试环境中复制问题要比将调试工具添加到实时环境中要好得多。


答案 2

您可以使用debug_backtracedebug_print_backtrace进行跟踪,尽管我从未使用过它们。最佳跟踪来自 xdebugZend 调试器。我同意 Gordon 的观点,即不应在生产计算机上安装调试器。


推荐