не удалось очистить буфер.Нет буфера для очистки с помощью метода ob_end_flush () - PullRequest
0 голосов
/ 26 октября 2018

Мой сайт воспроизводит потоковый 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 голосов
/ 26 октября 2018

Итак, глядя на исходный код PHP для ob_flush(), в котором и генерируется ошибка "failed to flush buffer. No buffer to flush", получается, что ошибка генерируется, если нет активного выходного буфера.

Исходя из исходного кода PHP, ob_end_flush() никогда не должен приводить к этой ошибке - это не может быть, ее нет в коде.Вы уверены, что в вашем коде нет ob_flush(), который вы не включили в то, что делитесь с нами в своем вопросе?

В любом случае, вы не проверяете возвращаемое значениеиз ob_start() - он может потерпеть неудачу, и если ему не удастся создать новый выходной буфер, то последующие ob_flush() или ob_end_flush() потерпят неудачу, потому что эти команды требуют активного выходного буфера для функционирования, и если нет 'Таким образом, они будут выдавать ошибки.

В исходном тексте PHP для ob_end_flush() вы можете видеть, что ошибка, которую он выдает, когда нет активного выходного буфера, равна "failed to delete and flush buffer. No buffer to delete or flush".

...