无法刷新缓冲区。没有要用 ob_end_flush() 方法刷新的缓冲区

failed to flush buffer. No buffer to flush with ob_end_flush() method

我的网站正在播放 mp3 文件,我间歇性地在日志文件中看到通知错误:

Notice: failed to flush buffer. No buffer to flush in

代码如下:

$filename = 'audio.mp3';
header("Content-Type: audio/mpeg");
header("Content-Length: ".filesize($filename));
header('Content-Disposition: inline; filename="' . $filename);
header("X-Pad: avoid browser bug");
header("Cache-Control: no-cache");
ob_clean();
flush();
set_time_limit(0);
$size = filesize($filename); 
$chunksize = 1 * (1024 * 1024);
if ($size > $chunksize) {
    $handle = fopen($filename, 'rb');
    $buffer = '';
    while (!feof($handle)) {
        $buffer = fread($handle, $chunksize);
        ob_start();
        echo $buffer;
        ob_end_flush();
        flush();
    }
    fclose($handle);
} else {
    readfile($filename);
}

错误总是指 ob_end_flush(); 行。

因此,查看 PHP source for ob_flush(),这是生成“failed to flush buffer. No buffer to flush”错误的地方,如果没有活动的输出缓冲区,似乎会生成错误。

根据 PHP 来源,ob_end_flush() 永远不会导致该错误 - 它不会,它不在代码中。您确定在您的代码中没有包含在您与我们分享的问题中的 ob_flush() 吗?

无论如何,您没有检查 ob_start() 的 return 值 - 它可能会失败,如果它无法创建新的输出缓冲区,那么随后的 ob_flush()ob_end_flush() 将失败,因为这些命令需要一个活动的输出缓冲区才能运行,如果没有,它们将发出错误。

您可以在 PHP source for ob_end_flush() 中看到,当没有活动输出缓冲区时它发出的错误是“failed to delete and flush buffer. No buffer to delete or flush”。