14

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

3 回答 3

25

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

  • 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. 最后一个关闭页面错误显示。

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

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

于 2011-04-13T15:31:42.280 回答
2

听起来软件本身可能正在设置错误级别,从而覆盖php.ini.

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


顺便说一句,如果您使用的是 Cacti,请参阅此处。即使你没有使用 Cacti,我认为它很好地总结了这个场景。

于 2011-04-11T22:31:00.310 回答
-4

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

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

或者:

@require_once('abc.pphp');

甚至:

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

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

于 2011-04-11T22:17:26.410 回答