如何不缓存调用缓存清单的php文件?

时间:2010-04-12 20:47:55

标签: caching html5 manifest jqtouch iphone-web-app

我正在使用jqtouch构建一个iphone应用程序,我使用cachemanifest来缓存所有静态文件(图像,css,javascript)以使其加载速度更快。但是该页面使用php作为动态内容,我不想缓存它。所以我用这个php脚本(manifest.php)生成cachemanifest:

<?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正在缓存。这会导致非常恼人的问题。

有没有办法处理这个或任何智能解决方法?该页面在cacheTeifest中列为NETWORK,但看起来这是因为从文件中调用了cachemanifest这一事实。

3 个答案:

答案 0 :(得分:2)

我有相同的经历,但在我的待办事项清单上有以下可能的解决方法:

  • 使用所有静态资源创建清单
  • 仅在一个html页面(buildCache.php)
  • 中包含对该清单的引用
  • 检查是否支持window.applicationCache,如果支持:
    • 每个会话重定向一次到cache.html以创建/检查/更新缓存
    • 让buildCache.php显示有关正在做什么的一些信息(使用applicationCache eventlisteners)
    • 将buildCache.php重定向回正常索引(未定义清单)

我希望(and someone claimed this is the case in a comment on my blog)同一域中的所有页面都将使用applicationCache中的静态资产,即使清单未在所有这些页面中都被引用。

答案 1 :(得分:2)

futta的想法是正确的,但您可能会发现,只有您的首页的一部分经常更改。将其留空,然后让页面的其余部分进行缓存,不要担心。当您访问该页面时,会立即调用缓存版本,您可以运行脚本从服务器获取动态页面片段并使用innerHTML进行设置以完成页面。结果是仍然有一个HTTP请求(另外一个用于清单),所以它并不慢,而且它还可以在下载动态部分时显示部分应用程序。如果您想要刷新整个页面,请在清单中标记该版本,并将其增加以重新加载整个应用程序。

干净整洁。我认为这就是系统的使用方式,而不是试图避免使用一些javascript,因为这毕竟是你可以解决离线问题的唯一方法,并在离线时对应用程序做有用的事情。

答案 2 :(得分:0)

另一个解决方案是将index.php保存为某种空白加载页面或启动画面,然后将用户重定向到实际的动态php页面。由于清单位于index.php中,而index.php重定向到real-index.php,因此问题可能不那么烦人。