首页 > 解决方案 > 尽管有 at 运算符@,如何静音禁用功能的错误日志记录?

问题描述

有人知道如何使禁用的功能(在我的情况下ini_set())停止抛出错误吗?我通常喜欢它,@ini_set()但在这个 WP 插件上,它仍然用以下内容填充 error_log:

[2018 年 4 月 30 日 12:01:39 UTC] 多合一事件日历:出于安全原因,ini_set() 已被禁用 @ /home/burp/public_html/wp-content/plugins/all-in-one-事件日历/all-in-one-event-calendar.php:81 #2

我怀疑这是因为 ini_set 实际上设置了一个回调函数,并且在定义的那个 ini_set() 函数中调用了另一个 ini_set() 。这是有问题的error_log'ed第81行:

@ini_set( 'unserialize_callback_func', 'spl_autoload_call' );

我是服务器管理员,几年前我禁用了 ini_set(),对此我没有任何问题,我只想静音该脚本上的错误日志记录。+100 个包含 ini_set() 的 WP 站点未报告任何错误,仅报告此特定错误,尽管 ini_set() 之前有 @。

标签: phperror-handlingerror-reportingerror-logini-set

解决方案


错误控制操作员 通常会抑制错误消息,但是定义的@自定义错误处理程序set_error_handler仍然可以导致错误通过error_log.

error_reporting如果触发错误的调用前面带有@. 错误处理函数应该在记录错误之前检查:

if (error_reporting()) {
    // Report the error
    error_log(...)
}

查看下面的日历代码,您可以看到它error_log是针对非致命错误调用的。error_reporting您可以简单地在该脚本中添加一个检查。

https://github.com/wp-plugins/all-in-one-event-calendar/blob/86c4e20dab7b199b20207fb3918a8807f7342fab/lib/exception/handler.php#L287

或者,您可以禁用error_log或重新启用ini_set该页面。

事后编辑:值得注意的是,尽管错误日志指定错误是由禁用 ini_set() 引起的,但该错误源自相关 ini_set() 中定义的函数回调的更深层次(显示的第 81 行在 OP 中)。所以基本上,这个错误甚至根本不相关。它冒泡到 ini_set() 并造成混乱作为原因,甚至该行与实际抛出的错误无关。


推荐阅读