尽管有 at 运算符 @,如何使禁用功能的错误记录静音?

How to mute error logging of a disabled function despite an at operator @?

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

[30-Apr-2018 12:01:39 UTC] All-in-One Event Calendar: ini_set() has been disabled for security reasons @ /home/burp/public_html/wp-content/plugins/all-in-one-event-calendar/all-in-one-event-calendar.php:81 #2

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

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

我是服务器管理员,我在几年前禁用了 ini_set(),我对此没有问题,我只是想忽略该脚本上的错误记录。所有包含 ini_set() 的 +100 WP 站点都没有报告任何错误,只有这个特定的错误,尽管 ini_set().

之前有 @

error control operator @ would normally suppress the error message, however a custom error handler defined with set_error_handler can still cause the error to be logged via error_log

如果触发错误的调用前面有 @

error_reporting 将 return 0。错误处理函数应该在记录错误之前检查:

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 or re-enable ini_set

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