IE不缓存视频(适用于Chrome)

时间:2014-08-06 21:16:27

标签: php internet-explorer http-caching

在使用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

测试操作:

  1. 加载页面
  2. 等待视频#1完成播放(而Fiddler更新缓存信息来自" -1"至" max-age / Expires"详情)
  3. 视频#2的按钮
  4. 等待视频#2完成播放(而Fiddler更新缓存信息)
  5. 视频#1的按钮
  6. 在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

    • 使用“安全”选项卡打开"启用保护模式"重新启动IE关闭或开启,不会改变上述结果。
    • 将磁盘空间增加到最大值(1024 MB)不会改变上述结果。
    • 将IE的策略设置为"检查存储页面的较新版本:从不"似乎没有"坚持":当关闭互联网选项,然后重新打开它时,单选按钮已经返回到"自动"。
    • ...
    • IE测试后重复Chrome测试确认缓存仍在Chrome中正常运行。

    更新#3

    服务器上的php代码不测试HTTP_IF_MODIFIED_SINCE;我没有发送Last-Modified标头。我假设maxage就足够了。如果存在Last-Modified,IE可能会更聪明地缓存视频文件。如果您对通过慢速服务器连接的视频有任何经验,并且成功使用了一组特定的标题,那么使用您使用的方法的答案将非常有用。

1 个答案:

答案 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; 
}