我正在使用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这一事实。
答案 0 :(得分:2)
我有相同的经历,但在我的待办事项清单上有以下可能的解决方法:
我希望(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,因此问题可能不那么烦人。