Php 8、如何忽略日志中被抑制的错误?

Php 8, how to ignore supressed errors from logging?

此代码表示缓存功能:

@ini_set('display_errors', '1');
error_reporting(-1);

set_error_handler(static function($errno, $errstr, $errfile, $errline, $vars = []) {
    if (error_reporting() === 0)
    {
        return;
    }
    echo 'ERROR: <pre>'; var_dump($errno, $errstr, $errfile, $errlne, $vars); echo '</pre>';
    return true;
});

echo "start\r\n";

$variable = @include('/none.txt');
if (!is_array($variable))
{
    $variable = [1,2,3];
}
file_put_contents('/none.txt', var_export($variable, true));

echo 'end';

这是合法的缓存处理。如果文件不存在,则该值不是数组,因此我们可以生成它并存储。我们还安装了微调错误记录器。

至少,以前是Php7.4

在 php 8.1 中,情况更加复杂,因为事实证明我们无法区分被抑制的错误和实际错误。 当然,我可以这样重写:

$variable = false;
if (is_file('/none.txt'))
{
    $variable = @include('/none.txt');
}
if (!is_array($variable))
{
    $variable = [1,2,3];
}
file_put_contents('/none.txt', var_export($variable, true));

问题是,这个版本不是线程安全的。如果有这么多用户加载站点并且 none.txt 被另一个线程删除怎么办?如果 is_file() 告诉它存在,但当它到达 include() 时文件已经消失了怎么办?将发生错误报告,没有人会接受“哦,那很好,它只是“行星对齐”。

您需要检查错误是否已消除:


set_error_handler(static function($errno, $errstr, $errfile, $errline, $vars = []) {
    if (error_reporting() === 0)
    {
        return;
    }
    if (!(error_reporting() & $errno)) { // <--------------------------
        return false; // Silenced
    }
    echo 'ERROR: <pre>'; var_dump($errno, $errstr, $errfile, $errlne, $vars); echo '</pre>';
    return true;
});

如文档中所述https://www.php.net/manual/en/language.operators.errorcontrol.php

看直播https://3v4l.org/hd72W