通过PHP推送的HTML5音频未缓存
我正在编写一个web音频播放器,我遇到了缓存不可靠的问题,我唯一想到的是我提供的标题 由于一般的复杂性和安全性,我必须通过PHP解析文件,这很好,因为这意味着我可以动态创建它们,但出现的问题是浏览器似乎不再缓存音频曲目,除非在极少数情况下,其他时候它们可能只缓存曲目的前1/4。我无法可靠地计算出缓存的内容或原因 为该文件提供服务的代码如下所示。仅供参考,“EncodeTrack”函数仅在轨道尚未创建时对其进行编码,如果文件已存在,则不会执行任何操作通过PHP推送的HTML5音频未缓存,php,html5-audio,Php,Html5 Audio,我正在编写一个web音频播放器,我遇到了缓存不可靠的问题,我唯一想到的是我提供的标题 由于一般的复杂性和安全性,我必须通过PHP解析文件,这很好,因为这意味着我可以动态创建它们,但出现的问题是浏览器似乎不再缓存音频曲目,除非在极少数情况下,其他时候它们可能只缓存曲目的前1/4。我无法可靠地计算出缓存的内容或原因 为该文件提供服务的代码如下所示。仅供参考,“EncodeTrack”函数仅在轨道尚未创建时对其进行编码,如果文件已存在,则不会执行任何操作 ## Track Decoder an
## 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;
}
我不知道我错过了什么。这也可能是我在部分内容处理方面做得不对,但据我所知,这是合理的。如果您怀疑部分内容处理有问题,请让
pecl\u http
发送正确的头和字节
将if(file_exists($transfile))
块替换为如下内容:
http_send_file($transfile);
您的代码更轻,对bug的敏感度更低。。。此外,它还为您提供了免费的附加功能,如http\u throttle()
希望这有帮助 我的视频文件也有类似的问题,在我的案例中,问题不在于代码,而在于公司的内部网络,这使得byterange请求无法得到正确处理(我猜是因为一些防火墙设置)。也许你也在遭受同样的痛苦——如果不是,请记住,流式传输可能是一个真正的痛苦,主要问题不是代码,而是网络传输。问题是它依赖于第三方模块,并且(对我来说,现在)模块无法编译。@Enverex:你试图编译什么?有时您需要php头文件包。在Ubuntu上查看这篇文章了解所需的命令:我正在尝试使用Arch AUR中的peclhttp包。我得到了-http_message_object.c:517:2:error:“zend_class_entry”没有名为“default_properties”的成员-据我所知,它是最新的稳定版本(1.7.1)。看起来版本1(2实际上还没有发布)与PHP5.4不兼容,这就是我无法编译它的原因。@Enverex您尝试过v1.7.2吗,他们说它现在兼容了: