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

时间:2018-10-26 00:54:56

标签: php hhvm

我的网站正在流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(); 行。

1 个答案:

答案 0 :(得分:1)

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

基于PHP源代码,ob_end_flush()永远不会导致该错误-不会,不会在代码中。您确定在代码中的某个地方没有ob_flush(),并且没有包含在与我们分享的问题中吗?

无论如何,您不是在检查ob_start()的返回值-它可能会失败,并且如果它无法创建新的输出缓冲区,则随后的ob_flush()ob_end_flush()将之所以失败,是因为这些命令需要一个活动的输出缓冲区才能起作用,如果没有,则会发出错误。

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