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
此代码表示缓存功能:
@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