在 php 错误日志中禁用 E_DEPRECATED

Posted

技术标签:

【中文标题】在 php 错误日志中禁用 E_DEPRECATED【英文标题】:Disable E_DEPRECATED in php error log 【发布时间】:2011-08-03 10:39:23 【问题描述】:

我有一台运行商业软件的生产服务器,该软件使用了已弃用的功能。我们已经在 php.ini 中禁用了错误输出——display_errors = Off——所以用户看不到这些错误。然而,我们仍在记录 PHP 错误 -- log_errors = On -- 以便追踪问题。

问题:PHP 似乎忽略了 error_reporting 指令,它最终传递给错误日志的内容。无论输入什么值组合,文件记录都会发生,就好像我设置为E_ALL。因此,我的错误日志充满了弃用通知。

在 php.ini 中设置了默认时区值,因此与时区相关的问题不相关。

软件包的升级尚不可用,因此请不要建议“仅修复已弃用的代码”。我正在专门寻找方法来防止 PHP 在不完全禁用文件日志记录的情况下将弃用的错误转储到日志中。

服务器详情:

Ubuntu 10.04.2 LTS PHP 5.3.2

【问题讨论】:

只需修复已弃用的代码。 鸭子 你是个风趣幽默的人,托马拉克。 :P 【参考方案1】:

当 PHP 作为 Apache 模块运行时,您可以使用 Apache 配置文件中的指令访问/更改 php.ini 中可用的任何配置设置。这些指令是...

php_value php_flag php_admin_value php_admin_flag

php_*php_admin_* 版本之间的区别是这个问题的关键。使用 php_admin_valuephp_admin_flag 设置的值只能在 Apache 全局和 VirtualHost 配置中设置;它们不能被 .htaccess 或 ini.set() 覆盖

error_reporting() 函数等效于 ini_set() 调用,并且属于相同的规则。

所以我进入了相关站点的虚拟主机配置,并添加了以下几行...

php_admin_value error_reporting 22527
php_admin_value error_log /custom/log/path/php_errors.log
php_admin_flag  log_errors On
php_admin_flag  display_errors Off

    第一行是error_reporting = E_ALL & ~E_DEPRECATED 的按位值。我通过创建一个简单的脚本检索了这个值:

    ini_set("error_reporting", E_ALL & ~E_DEPRECATED);
    echo ini_get("error_reporting");
    

    如果您想忽略系统通知和弃用警报 -- error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE -- 按位值是 22519

    第二行将所有 PHP 错误发送到自定义日志。默认情况下,PHP 将使用 syslog 值,通常是 /var/log/apache2/error.log 或类似的值。

    第三行启用文件日志记录。

    最后一个关闭页面错误显示。

同样,操作的优先级和顺序在这里很关键。这些值取代了php.ini 中定义的值,同时不能被应用程序或.htaccess 文件中的其他更改覆盖。

有关更改 php.ini 之外的配置值的更多详细信息,请参阅PHP documentation。

【讨论】:

感谢您的回答。但是,error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE 不起作用。 phpinfo() 选择正确的值 (22519)。但是我的日志仍然充斥着E_DEPRECATED。有什么想法吗? @直到你找到答案? @Ascherer 它对我也不起作用.. 到目前为止,我正在逃避:tail -f /custom/log/file | grep -v "is deprecated occured" 我同意,这不适用于 Apache 2.4。 “/var/log/apache2/error.log”仍然充斥着这些消息。【参考方案2】:

听起来软件本身可能正在设置错误级别,因此覆盖了@​​987654322@中的设置。

如果这是真的,那么你就是 SOL。


顺便说一下,如果您使用的是 Cacti,请参阅 here。即使您不使用 Cacti,我认为它也很好地总结了这个场景。

【讨论】:

【参考方案3】:

您可以使用@ 符号来抑制警告(除非使用自定义错误处理程序),例如:

@unlink("http://something.bad/");

或者:

@require_once('abc.pphp');

甚至:

$var = @$_GET['something not set'];

也就是说,您必须明智地使用它,它很容易导致问题,并且使调试变得更加困难。

【讨论】:

不要使用@!使用 PHP 错误报告设置来显示或隐藏警告。使用 @ 时没有任何通知。使用错误报告设置,您可以将所有错误记录到错误日志而不显示它们。这样他们就不会迷路了。 首先,我的帖子中有一个非常明显的免责声明。其次,在禁用所有错误和仅隐藏一个正在填充日志的已知错误之间,我会采用后一种方法。第三……您知道这是我 5 年前写的答案吗?从那时起,我们已经有了 6 个主要的 PHP 版本...... 有时@ 很有用,特别是对于文件操作,无论命令多么抢先,命令都可能失败。例如,可以使用file_exists 在使用file_get_contents 之前检查文件,但文件可能会被它们之间的另一个会话删除,因此发出E_WARNING

以上是关于在 php 错误日志中禁用 E_DEPRECATED的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .htaccess 文件中禁用 PHP 中的通知和警告?

禁用部分页面php的警告和通知

如何在 syslog 中禁用 logstash 错误日志记录

在 Oozie 4.2 中禁用工作流错误日志

如何在 docker 容器中禁用核心文件转储

PHP优化笔记