Как не кэшировать php файл, где вызывается кешманифест? - PullRequest
1 голос
/ 13 апреля 2010

Я создаю приложение для iphone с помощью jqtouch, и я использую cachemanifest для кэширования всех статических файлов (изображения, css, javascript), чтобы оно загружалось быстрее. Однако страница использует php для динамического содержимого, и я не хочу это кэшировать. Поэтому я создаю кешманифест с помощью этого php-скрипта (manifest.php):

<?php
header('Content-Type: text/cache-manifest');
echo "CACHE MANIFEST\n";

$hashes = "";
$lastFileWasDynamic = FALSE;

$dir = new RecursiveDirectoryIterator(".");
foreach(new RecursiveIteratorIterator($dir) as $file) {
  if ($file->IsFile() && $file != "./manifest.php" &&
    substr($file->getFilename(), 0, 1) != ".") {
    if(preg_match('/.php$/', $file)) {
      if(!$lastFileWasDynamic) {
        echo "\n\nNETWORK:\n";
      }
      $lastFileWasDynamic = TRUE;
    } else {
      if($lastFileWasDynamic) {
        echo "\n\nCACHE:\n";
        $lastFileWasDynamic = FALSE;
      }
    }
    echo $file . "\n";
    $hashes .= md5_file($file);
  }
}

echo "\nNETWORK:\nhttp://chart.apis.google.com/\n\n# Hash: " . md5($hashes) . "\n";
?>

Это действительно хорошо работает, за исключением одной раздражающей вещи:

Из того, что я где-то прочитал, файл, который вызывает cachemanifest, автоматически включается в манифест и кэшируется. Это означает, что моя стартовая страница index.php, где я называю cachemanifest, кэшируется. Это приводит к очень раздражающим проблемам.

есть ли способ справиться с этим или любым умным обходным путем? Страница находится в манифесте кеша, указанном как NETWORK, но похоже, что это нарушается тем фактом, что кешманифест вызывается из файла.

Ответы [ 3 ]

2 голосов
/ 14 апреля 2010

Идея futta верна, но, вероятно, вы обнаружите, что часто меняется только один раздел вашей главной страницы. Оставьте это пустым, затем позвольте кэшировать остальную часть страницы и не беспокойтесь об этом. Когда вы посещаете страницу, кешированная версия вызывается мгновенно, и вы можете запустить скрипт, чтобы получить динамический фрагмент страницы с сервера и установить его с помощью innerHTML для завершения страницы. Эффект заключается в том, что есть еще один HTTP-запрос (плюс один для манифеста), поэтому он не медленнее, и, кроме того, вы можете показывать часть своего приложения во время загрузки динамического раздела. Если вы хотите обновить всю страницу, укажите в манифесте комментарий, отмечающий версию, и увеличьте его, чтобы перезагрузить все приложение.

Чисто и аккуратно. Я думаю, что именно таким образом система предназначена для использования, не пытаясь избежать небольшого количества javascript, поскольку это, в конце концов, единственный способ, которым вы можете поиграть с офлайном и делать полезные вещи с приложением, когда офлайн.

2 голосов
/ 13 апреля 2010

У меня такой же опыт, но есть следующий возможный обходной путь в моем списке задач:

  • создать манифест со всеми статическими активами
  • включить ссылку на этот манифест только на одной html-странице (buildCache.php)
  • проверить, поддерживается ли window.applicationCache и если да, то:
    • перенаправить один раз за сеанс в cache.html, чтобы создать / проверить / обновить кэш
    • заставляет buildCache.php отображать некоторую информацию о том, что делается (с помощью обработчиков событий applicationCache)
    • иметь buildCache.php, перенаправить обратно на обычный индекс (где манифест не определен)

Я надеюсь ( и кто-то заявил, что это так в комментарии к моему блогу ), что все страницы в одном домене будут использовать статические ресурсы в applicationCache, даже если на манифест не ссылаются в все они.

0 голосов
/ 21 апреля 2011

Другим решением было бы сохранить ваш index.php как пустую загрузочную страницу или заставку, а затем перенаправить пользователя на реальную динамическую страницу php. Поскольку манифест находится в index.php, а index.php перенаправляет на real-index.php, проблема может быть меньше раздражающей.

...