Мой сайт воспроизводит потоковый 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 источник для ob_flush()
, гдеfailed to flush buffer. No buffer to flush
msgstr «ошибка генерируется, похоже, ошибка генерируется, если нет активного выходного буфера.
Основываясь на источнике 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
».
Других решений пока нет …