在HTML5 appcache中缓存php页面

aru*_*bel 5 php html5 offline cache-manifest html5-appcache

我正在开发一个离线应用程序,它也有一组.php页面.目前我已将这些php文件放在.appcache清单文件中,并且工作正常.但问题是,即使我在线,当我尝试访问php页面时,它会加载缓存版本.我更喜欢的是这样的功能,

  • 如果在线 - 连接到服务器并加载最新信息,并用新信息覆盖缓存的信息.
  • 如果离线 - 显示上次更新的静态html页面.

这是我的.appcache清单文件内容

CACHE MANIFEST
#2
taskmanager.php
public/css/bootstrap.css.map
public/css/bootstrap.min.css
public/css/bootstrap-theme.css.map
public/css/bootstrap-theme.min.css
public/css/main.css
public/css/task-manager.css
public/js/app.js
public/js/taskmanager.js
public/js/offlink.js
public/js/jquery-2.1.4.js
public/js/bootstrap.min.js

NETWORK:
*
http://*
Run Code Online (Sandbox Code Playgroud)

taskmanager.php所做的是从数据库中读取任务并显示它.当我像上面一样缓存它时,它将始终显示第一次加载时的任务列表.即使我在线,它也不会调用数据库并获取新条目.而是从缓存加载.所以,我的解决方案是将它放在FALLBACK部分中,如第一个答案所述.即使我把taskmanager.php文件放在FALLBACK部分下面,如下所示,

FALLBACK
taskmanager.php static_taskmanager.php
Run Code Online (Sandbox Code Playgroud)

现在,如果我有互联网连接,taskmanager.php将运行并将显示最新任务.但是我想以这样的方式创建static_taskmanager,它将与那些最新的任务集同步.这意味着,当用户离线时,static_taskmanager.php将显示当用户在线时taskmanager.php返回的最新任务列表.但目前它作为一个完整的静态页面工作.

  1. 是否有可能做到这一点?
  2. 我该如何解决这个问题?

编辑

正如我通过搜索SO和Google所理解的,实现此目的的一种方法是使用AJAX加载动态内容.但我想知道是否可以只使用清单文件本身.

use*_*349 1

使用 FALLBACK 怎么样?

倒退

FALLBACK 部分告诉浏览器当用户尝试离线访问未缓存的资源时要提供什么服务。因此,它看起来与 CACHE 和 NETWORK 有点不同。它每行包含两个值,用空格分隔。第一个值是要匹配的请求 URI,第二个值是匹配时发送的资源。它缓存右侧的资源以供离线使用,因此这应该是显式路径。(http://html5doctor.com/go-offline-with-application-cache/

FALLBACK:
/main.php /static.php
Run Code Online (Sandbox Code Playgroud)

使用此配置,除非用户离线,否则将服务 /main.php 的请求,在这种情况下,用户将看到 /static.php 的最后缓存版本。

请记住,更新服务器上的资源不会触发缓存更新。您必须修改清单文件。在这种情况下,您可能希望在创建新版本的 static.php 时使用版本或时间戳注释更新清单。

# Generated: 2015-07-23 10:34a
Run Code Online (Sandbox Code Playgroud)

后期笔记

在这种情况下,我建议从缓存中删除 main.php,或者使用静态后备,让用户知道他们正在查看较旧的内容。原因是,即使 static.php 被更新,如果用户离线并且没有得到更新,他们仍然会看到旧的内容。

如果您发现性能问题并希望减少服务器上的负载,您可以使用 wget 创建 main.php 的静态版本,如下所示:

wget http://example.com/main.php -O main.html
Run Code Online (Sandbox Code Playgroud)

这会将页面内容存储为 HTML。作为一个 cron 作业运行,它可以每五分钟左右刷新一次。

另一种方法是每次更新 static.php 和应用程序缓存,这可能会导致所有资源重新加载 - 从而违背缓存的意图。