此代碼表示快取功能:
@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';
這是一個合法的快取處理。如果檔案不存在,則該值不是陣列,因此我們可以生成它并存盤。我們還安裝了微調錯誤記錄器。
至少,它曾經是 PHP 7.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()檔案時已經消失了怎么辦?將發生錯誤報告,沒有人會接受“哦,那很好,它只是“行星對齊”。
uj5u.com熱心網友回復:
您需要檢查錯誤是否已消除:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/442491.html
