【问题标题】:How to not cache a php file where a cachemanifest is beeing called?如何不缓存正​​在调用缓存清单的 php 文件?
【发布时间】:2010-04-12 20:47:55
【问题描述】:

我正在使用 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 的缓存清单中,但看起来这已被从文件中调用缓存清单的事实所推翻。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 感谢您的意见。我试图创建一个仅包含静态内容的 amnifest,但如果我不包含清单文件中的每个页面,它就不起作用。它还会自动包含要求它的文件,这是主要问题。尝试制作特殊页面来缓存内容,但它还没有像我想要的那样工作,将继续对此进行试验。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2013-12-26
        • 1970-01-01
        • 1970-01-01
        • 2013-12-29
        • 1970-01-01
        • 2011-10-30
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        相关资源
        最近更新 更多