尽管有 at 运算符 @,如何静音禁用函数的错误日志记录?

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

提问人:that-ben 提问时间:4/30/2018 最后编辑:that-ben 更新时间:4/30/2018 访问量:364

问:

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

[2018 年 4 月 30 日 12:01:39 UTC]多合一活动日历:出于安全原因,ini_set() 已被禁用 @ /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(),我对此没有问题,我只想将该脚本上的错误日志记录静音。+100 个都包含 ini_set() 的 WP 站点没有报告任何错误,只有这个特定的错误,尽管 ini_set() 之前有 @。

php 处理 报告 错误 日志 ini-set

评论

5赞 John Conde 4/30/2018
您阅读了错误消息吗?不是函数抛出该错误,而是PHP抛出该错误。
1赞 aynber 4/30/2018
禁用错误的最佳方法是删除/修复有问题的行。如果这是第三方脚本,请联系维护人员,了解是否有必要以及是否可以将其删除。
1赞 that-ben 4/30/2018
天哪,我知道,我是服务器管理员,几年前我禁用了 ini_set(),我对此没有问题,我只想将该脚本上的错误日志记录静音。+100 个都包含 ini_set() 的 WP 站点没有报告任何错误,只有这个特定的错误,尽管 ini_set() 之前有 @。这更清楚吗?
1赞 Script47 4/30/2018
@that-ben 学会使用你的标题/正文来清楚地澄清问题,而不是添加单词让它在未来看起来很滑稽。之所以出现这种混乱,是因为你从未澄清过你的意思。
5赞 mario 4/30/2018
装饰器只是禁止显示默认的错误显示处理程序,而不是任何自定义错误显示处理程序或日志记录本身。 (它通常被称为“错误抑制运算符”,但这有点误导。@

答:

2赞 jspcal 4/30/2018 #1

错误控制运算符通常会禁止显示错误消息,但是使用 set_error_handler 定义的自定义错误处理程序仍可能导致通过error_log记录错误。@

如果触发错误的调用前面有 error_reporting ,则返回 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或重新启用ini_set

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

评论

0赞 that-ben 4/30/2018
所以error_reporting(0);那么那条故障线error_reporting(E_ALL); ?
0赞 hakre 4/30/2018
但是@不是已经有效地做到了这一点(暂时将错误报告级别设置为 0)吗?所以它只需要检查那个错误处理程序,对吗?
1赞 jspcal 4/30/2018
为了尊重运算符,用户定义的错误处理函数需要在调用之前手动检查,现在似乎没有这样做。请参阅上面的片段。@if (error_reporting())error_log