1

我正在使用 jqtouch 构建一个 iphone 应用程序,并且我使用缓存清单来缓存所有静态文件(图像、css、javascript)以使其加载更快。但是该页面使用 php 作为动态内容,我不想缓存它。所以我用这个 php-script(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";
?>

这实际上非常有效,除了一件令人讨厌的事情:

从我在某处读到的内容中,调用缓存清单的文件会自动包含在清单中并且正在缓存中。这意味着我的起始页 index.php,我称之为缓存清单的地方正在缓存。这会导致非常恼人的问题。

有什么办法可以解决这个问题或任何聪明的解决方法吗?该页面在列为 NETWORK 的缓存清单中,但看起来这被从文件中调用缓存清单的事实推翻了。

4

3 回答 3

2

我有同样的经历,但在我的待办事项列表上有以下可能的解决方法:

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

我希望(有人在我的博客上的评论中声称这是这种情况)同一域上的所有页面都将使用 applicationCache 中的静态资产,即使清单没有在所有页面中引用。

于 2010-04-13T10:19:55.820 回答
2

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

干净整洁。我认为这就是系统的使用方式,而不是试图避免一点 javascript,因为毕竟这是您可以离线玩游戏并在离线时使用应用程序做有用事情的唯一方法。

于 2010-04-14T01:04:37.543 回答
0

另一种解决方案是将您的 index.php 保留为空白加载页面或某种启动屏幕,然后将用户重定向到实际的动态 php 页面。由于清单在 index.php 中,并且 index.php 重定向到 real-index.php,所以问题可能不那么烦人。

于 2011-04-21T17:07:56.793 回答