我有一台运行商业软件的生产服务器,它利用了已弃用的功能。我们已经在php.ini中禁用了错误输出 - display_errors = Off
- 因此用户没有看到这些错误。但是,我们仍然记录PHP错误 - log_errors = On
- 以便追踪问题。
问题:PHP似乎忽略了error_reporting
指令,关于它最终传递给错误日志的内容。无论输入什么值组合,都会发生文件记录,就像我设置为E_ALL
一样。因此,我的错误日志会因弃用通知而膨胀。
默认时区值在php.ini中设置,因此与时区相关的问题无关紧要。
软件包的升级尚不可用,因此请不要“仅修复已弃用的代码”。我正在寻找防止PHP将弃用的错误转储到日志中而不完全禁用文件日志记录的方法。
服务器详细信息:
答案 0 :(得分:24)
当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。
答案 1 :(得分:2)
听起来软件本身可能正在设置错误级别,因此会覆盖php.ini
中的设置。
如果这是真的,那你就是SOL。
顺便提一下,如果您使用的是仙人掌,请参阅here。即使你没有使用Cacti,我认为它很好地总结了这个场景。
答案 2 :(得分:-3)
您可以使用@
符号来禁止警告(除非使用自定义错误处理程序),例如:
@unlink("http://something.bad/");
或者:
@require_once('abc.pphp');
甚至:
$var = @$_GET['something not set'];
那就是说,你必须明智地使用它,它很容易引起问题,这会使调试变得更难。