为啥不在 PHP 中使用最高错误报告级别?

Posted

技术标签:

【中文标题】为啥不在 PHP 中使用最高错误报告级别?【英文标题】:Why not to use highest error reporting level in PHP?为什么不在 PHP 中使用最高错误报告级别? 【发布时间】:2010-11-05 10:03:30 【问题描述】:

我希望你说明为什么有人不应该在 php 中使用尽可能高的错误报告级别?

设置最高等级的方法:

PHP

error_reporting(E_ALL | E_STRICT);

PHP >= 5.4:

error_reporting(E_ALL);

PHP 所有版本(推荐给config files):

error_reporting(2147483647);

PHP 所有版本(我的配置,-1 将包含所有错误且易于记忆)

error_reporting(-1);

我的经历:

报告水平低没有理由 从未使用过error control operator 用于通过set_error_handler 和自定义异常类将所有错误转换为异常以覆盖文件和行

【问题讨论】:

“因此,请考虑使用更大的值代替 E_ALL 来涵盖从现在到未来的所有位字段,例如 2147483647 之类的数值。”:如果这是用于 error_reporting 的推荐值,为什么他们没有将 E_ALL 设置为 2147483647??? 如果是生产。有时他不希望客户看到 img 不存在的警告或其他东西 @haim:您应该记录错误而不是在浏览器中显示它们。 请记住,问题不是您想对错误做什么(显示或记录)。 请注意,最高错误报告级别的十六进制表示法比十六进制更容易记住:
0x7FFFFFFF
(
0x
对于十六进制表示法,一个 7 然后 7
F
's)
【参考方案1】:

我个人更喜欢以***别的错误报告编写代码,并修复我的代码生成的所有警告。但是,我可以设想您可能希望在较低级别工作的几个原因:

    您可能正在使用会发出大量警告的遗留代码。如果代码正常工作,这不是问题,但“噪音”可能会分散您的注意力并阻止您看到真正的问题。在这种情况下,可能需要降低错误报告级别。 在生产环境中,您可能只想记录错误。这有两个好处,这意味着您的错误日志只包含需要注意的关键问题,并且可以节省磁盘空间(并减少磁盘 i/o)。

题外话:在生产环境中,您应该运行“display_errors = Off”和“error_logging = On”以防止用户看到 PHP 错误(可能包含敏感信息,例如数据库连接属性),并将错误日志收集为它们发生。因此,您的生产 error_reporting 级别和相关设置可能与您希望在开发中运行的不同。

【讨论】:

【参考方案2】:

我认为没有充分的理由,除了 Jim 在第一点中所说的,运行无法或不会更改的遗留代码。

您当然应该在开发期间以***别运行它,并清除所有警告和通知,除非您有充分的理由不这样做。

如果您有充分的理由在开发期间不修复通知,则应将其记录下来并使用错误控制运算符以避免日志混乱。

【讨论】:

【参考方案3】:

除了 Jim 的观点,我始终建议使用***别的错误报告进行编码,因为它应该为您提供更好的可移植性和(可能)更好的性能。

【讨论】:

我看不出性能如何适应这一点,除了错误控制操作符很慢。 使用错误控制算子会有轻微的性能开销。然而,主要的性能成本是触发警告本身的行为(然后被抑制)。我在最初的答案中没有考虑到这一点,但 Will 实际上是正确的,发出大量警告(报告或其他)的代码可能比不发出警告的干净代码运行得慢。有关基准,请参阅 vega.rd.no/articles/php-performance-error-suppression。【参考方案4】:

嗯,从系统管理员 PoV 来看...有时您无法对旧代码或新代码做任何事情。一些开发人员没有正确调试,如果你在无关紧要的事情上浪费任何人的时间,经理会觉得你很有趣(不确定这是否会让任何人感到不安,但如果前后结果相同,那么这并不重要)。我很高兴我可以禁用通知并专注于任何实际问题。

另外,这只是在黑暗中的一个镜头,但也许有一些方法可以通过使用 error_log() 调用在调试方面做一些花哨的事情。

【讨论】:

以上是关于为啥不在 PHP 中使用最高错误报告级别?的主要内容,如果未能解决你的问题,请参考以下文章

PHP错误级别设置

PHP中如何设置error_reporting错误报告级别

PHP中如何设置error_reporting错误报告级别

PHP中错误处理

php error_reporting()关闭报错

PHP的错误处理