【问题标题】:Do not log supressed PHP Warning不要记录被抑制的 PHP 警告
【发布时间】:2013-05-08 20:42:14
【问题描述】:

有什么方法可以查明这个警告是否被抑制或没有使用 set_error_handler() 函数? @somethingwrong() 和 somethingwrong() 的代码为 2。但我不想记录所有警告。例如,像 gzuncompress() 这样的一些函数必须以这种方式处理,因为我无法测试有效的输入数据。

$handler = new errorHandler();
error_reporting(0);
set_error_handler(array($handler, 'handle'));
set_exception_handler(array($handler, 'exception'));
register_shutdown_function(array($handler, 'shutdown'));

class errorHandler
{
public function handle($code, $text, $file, $line)
{
    if (($code & (E_STRICT | E_NOTICE)) == 0)
        $this->log(...);
}

public function exception($exception)
{
    ...
}

public function shutdown()
{
    $e = error_get_last();
    if ($e !== NULL)
        $this->log($error);
}
}

// the errors
include('notexisting.file'); // should be logged
@gzuncompress('somenonsens'); // should not be logged

【问题讨论】:

  • 您要禁止显示哪个“此警告”?使用 error_reporting(0) 可以禁用错误报告。也许您的意思是 error_reporting(-1) 或类似的? @somethingwrong() 的代码 2 是什么?请澄清您的问题。
  • 正如您在 php.net 上看到的,代码 2 用于 E_WARNING,4 用于 E_PARSE,...如果您说它正在禁用,那么为什么它仍然会记录所有错误?但它关闭了显示错误。现在我写了 ini_set('display_errors','Off');错误报告(-1);效果是一样的。

标签: php suppress-warnings ierrorhandler at-sign


【解决方案1】:

你试过了吗?我认为,如果您在 @gzuncompress 中使用 @ ,您将不会收到正常警告,也不会调用错误处理程序。

【讨论】:

  • 是的,我做到了。这就是我问的原因。它不影响报告。也许它是由一些 ini-entry 控制的东西?
  • PHP 手册指出,无论使用 at 符号如何,都会调用错误处理程序,并且确实会发生这种情况。如果我弄清楚了,我会写一个答案。
【解决方案2】:

我找到了解决方案。最初,我打电话给

error_reporting(E_USER_ERROR);

这会抑制除一个错误之外的所有错误,我避免自己提出错误,因此它永远不会发生。我这样做是因为我自己拦截了所有错误,并以四种方式(筛选、电子邮件、本地日志、PHP 日志)中的任何一种方式报告它们。我也这样做是为了避免错误报告级别为 0。

然后,在错误处理程序或关闭函数中,我可以通过改变错误报告级别的事实来检测 at 符号的使用:

if (error_reporting() != E_USER_ERROR)
    return; // Ignore this error

注意 at 符号的效果在 PHP 7 和 8 之间会发生变化。我没有用 8 版本测试过。

【讨论】:

    猜你喜欢
    • 2017-06-10
    • 1970-01-01
    • 2011-12-28
    • 2012-07-13
    • 2020-02-15
    • 2014-01-20
    • 2018-08-30
    • 2015-08-03
    • 2011-04-01
    相关资源
    最近更新 更多