У меня есть веб-сайт, который я использую для потоковой передачи аудиофайлов. В основном, MP3 & OGG. Начиная с нескольких месяцев, я обрабатываю себя (PHP) парную часть (до того, как она была apache2). Сначала я делаю обычный ответ 200 OK с нарезанным двоичным ответом моих мультимедийных аудиофайлов (для выделения памяти). Он работает нормально, но я получил бесконечность на всех своих аудио. Согласно этому вопросу, я вчера обновил потоковое содержимое.
И теперь у меня есть одна из самых странных ошибок, которые я мог себе представить. Мой рефактор кода работает отлично с MP3, но не с OGG … Изображения или загрузка zip также работают с классом выше, и оба они отлично работают по-прежнему.
Вот мой класс Stream.
<?php class Stream extends Response { protected $filepath; protected $delete; protected $range = ['from' => 0, 'to' => null]; public function __construct($filePath, $delete = false, $range = NULL) { $this->delete = $delete; $finfo = finfo_open(FILEINFO_MIME_TYPE); $mimeType = finfo_file($finfo, $filePath); $size = filesize($filePath); $this->headers['Content-Type'] = $mimeType; $this->headers['Content-Length'] = $size; $this->headers['Accept-Ranges'] = 'bytes'; $this->headers['Content-Transfer-Encoding'] = 'binary'; unset($finfo, $mimeType); $this->code = 200; $this->range['to'] = $size - 1; if ($range !== NULL) { if (preg_match('/^bytes=\d*-\d*(,\d*-\d*)*$/i', $range) === false) { $this->code = 416; } else { $ranges = explode(',', substr($range, 6)); foreach ($ranges as $rangee) { $parts = explode('-', $rangee); $this->range['from'] = intval($parts[0]); $this->range['to'] = intval($parts[1]); if (empty($this->range['to'])) { $this->range['to'] = $size - 1; } if ($this->range['from'] > $this->range['to'] || $this->range['to'] >= $size) { $this->code = 416; } } $this->code = 206; } } if ($this->code === 416) { $this->headers = ['Content-Range' => 'bytes */{' . $size . '}']; } elseif ($this->code === 206) { $this->headers['Content-Range'] = 'bytes {' . $this->range['from'] . '}-{' . $this->range['to'] . '}/{' . $size . '}'; } $this->filepath = $filePath; } public function show() { http_response_code($this->code); foreach ($this->headers as $header => $value) { header($header . ': ' . $value); } $file = fopen($this->filepath, 'r'); fseek($file, $this->range['from']); $interval = $this->range['to'] - $this->range['from']; $outputBufferInterval = 4 * 1000; if ($interval < $outputBufferInterval) { $outputBufferInterval = $interval; } ob_start(); while ($interval > 0) { echo fread($file, $outputBufferInterval); $interval -= $outputBufferInterval; ob_flush(); } fclose($file); ob_end_clean(); if ($this->delete) { unlink($this->filepath); } } }
Я немного запутался в HTTP_RANGE. Спасибо,