php - 如何让 PHP 在发生 fatal error 时记录堆栈跟踪

标签 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

但是,在生产机器 (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/

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

最佳答案

好吧,正如已经指出的那样,您在实时机器上没有得到相同的格式,因为实时机器没有安装 xdebug。有 debug_backtrace 但这不会捕获 fatal error 。

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

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

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

关于php - 如何让 PHP 在发生 fatal error 时记录堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5350070/

相关文章:

php - 如何为 Intuit 合作伙伴平台创建 Oauth 签名和 SAML 断言?

php - 从具有多对多关系的表中获取结果的单个 SQL 查询

php - 如何使用连接权限将简单查询写入codeigniter查询

php - MySQL select where column is falsey

php - 基于 Laravel token 的用户身份验证?

php - mysql_query 保留在返回的表中创建的数据类型?

php - mysql_fetch_row 循环不返回第一组结果

php - 使用PHP从Mysql检索Mktime值

php - 自定义 Artisan 命令以执行多个命令

php - 如何安装paypal商户SDK