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

tro*_*skn 27 php

我已经配置了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
Run Code Online (Sandbox Code Playgroud)

但是,在生产机器(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/
Run Code Online (Sandbox Code Playgroud)

我该如何控制这种格式?我非常希望在日志中提供堆栈跟踪.

Gor*_*onM 18

好吧,正如已经指出的那样,你没有在现场机器上获得相同的格式,因为实时机器没有安装xdebug.有debug_backtrace但不会发现致命错误.

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

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

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