在php错误日志中禁用E_DEPRECATED

时间:2011-04-11 22:10:44

标签: php error-log

我有一台运行商业软件的生产服务器,它利用了已弃用的功能。我们已经在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

3 个答案:

答案 0 :(得分:24)

当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
  1. 第一行是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

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

  3. 第三行启用文件记录。

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

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

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

答案 1 :(得分:2)

听起来软件本身可能正在设置错误级别,因此会覆盖php.ini中的设置。

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


顺便提一下,如果您使用的是仙人掌,请参阅here。即使你没有使用Cacti,我认为它很好地总结了这个场景。

答案 2 :(得分:-3)

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

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

或者:

@require_once('abc.pphp');

甚至:

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

那就是说,你必须明智地使用它,它很容易引起问题,这会使调试变得更难。