在 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_value
和 php_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 中的通知和警告?