웹 오디오 플레이어를 쓰고 있는데 캐시가 제대로 작동하지 않는 문제가 있습니다. 내가 제공하는 헤더가 마음에 듭니다.HTML5 오디오가 캐싱되지 않은 PHP를 통해 전달됨
일반적이고 보안상의 문제로 인해 PHP를 통해 파일을 구문 분석해야합니다. 즉석에서 파일을 만들 수 있기 때문에 괜찮습니다.하지만 문제는 브라우저가 오디오를 캐시하지 않는 것입니다. 드문 경우를 제외하고는 더 이상 트랙을 재생할 수 없으며 트랙의 처음 1/4 만 캐시 할 수도 있습니다. 나는 캐싱 (caching) 또는 캐싱 (caching) 이유를 안정적으로 해결할 수 없습니다.
파일을 제공하는 코드는 다음과 같습니다. 참고로, "EncodeTrack"기능은 트랙을 이미 인코딩하지 않은 경우에만 인코딩합니다. 파일이 이미 존재하는 경우 아무 것도 수행하지 않습니다.
## Track Decoder and Streamer
if($_GET['playtrack']) {
error_log("Dec Start");
$dectimer = microtime(1);
ini_set('display_errors', 0);
$track = trim($_GET['playtrack']);
preg_match('%^(\w+)\-(\w+)\.(\w+)$%', $track, $trackbits);
$trackid = $trackbits[1];
$trackquality = $trackbits[2];
$trackformat = $trackbits[3];
$trackarr = mysql_fetch_array(mysql_query("SELECT * FROM `tracks` NATURAL JOIN `artists` NATURAL JOIN `albums` WHERE `track_hash` = '$trackid' LIMIT 1"));
$file = "$musicfolder/$trackarr[artist_folder]/$trackarr[album_folder]/$trackarr[track_path]";
$trackpath = escapeshellarg($file);
EncodeTrack($trackid, $trackformat, $trackpath, $trackquality);
$transfile = "tmp/$trackid-$trackquality.$trackformat";
if(file_exists($transfile)) {
$filesize = filesize($transfile);
$file = fopen($transfile, 'r');
if($_SERVER['HTTP_RANGE']) {
$partial = 1;
$range = str_replace('bytes=', '', $_SERVER['HTTP_RANGE']);
$range = explode(',', $range);
$range = explode('-', $range[0]);
if($range[0] === '') {
$end = $filesize - 1;
$start = $end - intval($range[0]);
}elseif($range[1] === '') {
$start = intval($range[0]);
$end = $filesize - 1;
}else{
$start = intval($range[0]);
$end = intval($range[1]);
if ($end >= $filesize || (!$start && (!$end || $end == ($filesize - 1)))) $partial = false; // Invalid range/whole file specified, return whole file
}
$length = $end - $start;
header("HTTP/1.1 206 Partial Content", 1, 206);
header("Content-Range: bytes $start-$end/$filesize");
fseek($file, $start);
}else{
$length = $filesize;
}
$data = fread($file, $filesize);
fclose($file);
header("Content-Length: $length");
header("Content-Type: audio/$trackformat");
header("Accept-Ranges: bytes");
header("Expires: Tue, 23 May 2062 10:00:00 GMT");
header("ETag: $length");
header("Cache-Control: public");
echo($data);
}else{
header("HTTP/1.1 404 Not Found", 1, 404);
}
error_log("Dec Complete - ".round((microtime(1) - $dectimer)*100));
exit;
}
나는 여기에서 놓친 아이디어가 없습니다. 부분적인 내용 처리 측면에서 내가 잘못하고있는 것일 수도 있지만, 제정신이라고 말할 수있는 한.
나는 비디오 파일과 비슷한 문제가 있었는데 문제는 코드가 아니라 companys 내부 네트워크가 byterange 요청을 차단하여 (일부 방화벽 설정 때문에) 제대로 처리되지 못하게했다. 어쩌면 당신은 똑같은 고통을 겪고 있습니다. 그렇다고하더라도 스트리밍이 진짜 고통이 될 수 있고 대부분 문제는 코드가 아니라 네트워크 전송이 될 수 있으므로 마음에 두십시오. – acme