在使用php + jsquery + javascript(例如index.php)构建的HTML页面上,视频标签的源是另一个php页面,其中GET字段指定要加载的视频(例如" getfile。 ?PHP文件= 111"。)
按钮切换正在播放的视频;例如的JavaScript
var video = document.getElementById('flyover');
var source = video.getElementsByTagName('source')[0];
source.setAttribute('src', "getfile.php?file=222");
getfile.php发出HTTP标头,然后发出fpassthru
文件内容。
...
header('Content-Type: video/mp4');
header('Content-Disposition: attachment; filename='.basename($file->FileName));
header('Content-Transfer-Encoding: binary');
$seconds_to_keep = ...
header ("Expires: " . gmdate("D, d M Y H:i:s", time() + $seconds_to_keep) . " GMT");
header('Cache-Control: public, max-age=' . $seconds_to_keep);
header('Content-Length: ' . filesize($filename));
fpassthru($fp);
exit;
用于确认标题的Fiddler代理:
# Result Protocol Host URL Body Caching Content-Type
47 200 HTTP ... /getfile.php?file=2639 10,113 public, max-age=31536000; Expires: Thu, 06 Aug 2015 20:20:30 GMT video/mp4
测试操作:
在Chrome上,结果是视频#1立即开始播放(缓冲条显示中途加载,这是我在视频开始时看到的最多)。 Fiddler没有显示新的" getfile"请求服务器。
在IE 11上,视频#1缓冲时存在延迟(缓冲条在视频开始时显示零加载)。 Fiddler会展示一个新的" getfile"请求服务器。
IE的缓存设置为"自动"。 (临时Internet文件/检查存储页面的较新版本="自动")。缓存大小为250 MB,视频大约为6 mb,缓存在开始测试之前已清空。
确认URL完全相同(根据fiddler,并在javascript中使用警告弹出窗口)。
问:还有什么可能影响IE未能缓存这些视频?
更新
IMAGES,通过相同的网址获取,但具有不同的查询字段fileid值,以及不同的Content-Type标头,在IE中进行缓存:如果退出浏览器,并重新启动浏览器,并转到同一页面,Fiddler不会显示任何" /getfile.php?fileid = 333"请求这些图像。 (它确实在缓存清除后第一次加载页面时显示了这些请求。)
执行的php代码(对于图像与视频)的唯一变化是单个if / else if语句,它控制发出Content-Type标头。
也许是IE 11的缓存政策不能缓存视频?
逻辑确实发出一个带文件大小的Content-Length标头,客户端互联网选项缓存(250 mbs)比文件大小(6 mb)大得多,所以它应该"#34;能够缓存它。磁盘空间可用很多GB。
更新#2
更新#3
服务器上的php代码不测试HTTP_IF_MODIFIED_SINCE;我没有发送Last-Modified标头。我假设maxage就足够了。如果存在Last-Modified,IE可能会更聪明地缓存视频文件。如果您对通过慢速服务器连接的视频有任何经验,并且成功使用了一组特定的标题,那么使用您使用的方法的答案将非常有用。
答案 0 :(得分:1)
点击http://php.net/manual/en/function.header.php#85146:
$last_modified_time = filemtime($file);
$etag = md5_file($file);
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");
header("Etag: $etag");
if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time ||
trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) {
header("HTTP/1.1 304 Not Modified");
exit;
}