2014-08-06 8 views
1

На HTML-странице, построенной с использованием php + jsquery + javascript (например, index.php), у видеотега есть источник, который является другой php-страницей, с полем GET, указывающим, какое видео load (например, «getfile.php? file = 111»).IE не кэширование видео (работает в Chrome)

Кнопки, на которых воспроизводится видео; например 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; 

Скрипач прокси используется для подтверждения заголовков:

# 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. Wait для видео # 1, чтобы закончить играть (и обновления Скрипач Кэширование информации из «-1» до «Максимальный возраст/Истекает»)
  3. Кнопка для видео # 2
  4. Подождите видео # 2, чтобы закончить играть (и обновления Скрипач Кэширование информации)
  5. выключатель для видео # 1

В Chrome, результатом является то, что видео # 1 немедленно начинает играть (и буферизация бар отображается на полпути, что я больше всего вижу при начале видео). Fiddler НЕ показывает новый запрос «getfile» на сервер.

В IE 11 есть задержка при буферах видео # 1 (а буферная панель показывает нуль, загруженную при начале видео). Fiddler DOES показывает новый запрос «getfile» на сервер.

Настройка кеша IE «автоматическая». (Временные файлы Интернета/Проверка новых версий сохраненных страниц = «Автоматически»). Размер кеша составляет 250 мб, видеоролики - ~ 6 мб каждый, а кеш был опустошен до начала тестирования.

Подтверждено, что URL-адрес точно такой же (в зависимости от скрипача и использования всплывающего окна предупреждения в javascript).

В: Что еще может повлиять на отказ IE кэшировать эти видео?

UPDATE

изображений, полученных с помощью того же URL, но с другим значением FILEID поля запроса, и другим заголовком Content-Type, кэшируем в IE: Если выйти из браузера и перезапустить браузер и перейти на той же странице, Fiddler не показывает никаких «/getfile.php?fileid=333» запросов для этих изображений. (Он показывал эти запросы, когда первая страница была загружена после очистки кеша.)

Единственное изменение в исполняемом php-коде (для изображений против видео) - это единственный оператор if/else if, который контролирует заголовок Content-Type испускается.

Возможно, политика кэширования IE 11 не кэширует видео?

Логика выводит заголовок Content-Length с размером файла, а кеш-ключ интернет-клиента (250 мб) намного больше размера файла (6 мб), поэтому он «должен» иметь возможность кэшировать его. Свободное место на диске - это много GB.

UPDATE # 2

  • Повторный запуск IE, после того, как с помощью вкладки Security, чтобы включить "Включить защищенный режим" выключен или включен, не изменяет полученные результаты.
  • Увеличение дискового пространства до максимума (1024 МБ) не меняет вышеуказанные результаты.
  • Настройка политики IE для проверки новых версий сохраненных страниц: никогда не кажется «прилипает»: при закрытии параметров «Интернет», а затем снова откройте его, радиокнопка вернулась к «Автоматически».
  • ...
  • Повторение теста Chrome после тестов IE подтверждает, что кеширование работает корректно в Chrome.

UPDATE # 3

PHP код на сервере не проверяет HTTP_IF_MODIFIED_SINCE; Я не отправляю заголовок Last-Modified. Я предполагал, что maxage будет достаточно. Возможно, что IE будет умнее кэшировать видеофайлы, если присутствует Last-Modified. Если у вас есть опыт работы с видео по медленным подключениям к серверу, и вам удалось использовать определенный набор заголовков, тогда вам будет полезен ответ с используемым вами подходом.

+0

Это, вероятно, может быть так, как видео не закодирован (и ничего общего с кэшем в IE). Вам нужна кодировка H.264, и правильная информация о файле должна быть в заголовке файла (а не только в заголовках HTTP). Вот немного чтения от Adobe. http://www.adobe.com/devnet/video/articles/mp4_movie_atom.html Есть утилиты, чтобы проверить заголовки и перекодировать при необходимости (некоторые из них, ffmpeg и handbrake два других) – Robbie

+1

@ Robbie - вы когда-нибудь слышали о случае, когда видео воспроизводилось нормально, но не оставалось в кеше? Эти файлы кодируются H.264 с помощью Handbrake для универсальной настройки Apple, с проверкой «Web», чтобы заголовки находились в начале файла. – ToolmakerSteve

+0

Не зная об этом. Это предложение было основано на проблемах с правильной потоковой обработкой видео и, таким образом, вызовом сервера, в идеале, им не нужно было. Отсюда и утверждение. – Robbie

ответ

0

Дайте этому выстрел из 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; 
} 
+0

Спасибо, я попробую. (На этой неделе мы займемся более неотложной задачей, поэтому у вас нет возможности попробовать это сейчас.) – ToolmakerSteve