在HTML5应用缓存中缓存PHP页面

5
我正在开发一个离线应用程序,其中包含一组.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://*

任务管理器(taskmanager.php)的功能是从数据库中读取任务并进行展示。当我像上面那样缓存它时,它将始终显示第一次加载时的任务列表。即使我在线,它也不会调用数据库并获取新条目。相反,它是从缓存中加载的。因此,我的解决方案是将其放在“FALLBACK”部分中,如第一个答案所述。即使我将taskmanager.php文件放在“FALLBACK”部分中,如下所示:
FALLBACK
taskmanager.php static_taskmanager.php

现在,只要我有互联网连接,taskmanager.php 就会运行并显示最新的任务。但是我希望将 static_taskmanager 设计成这样一种方式:它能够与最新的任务集同步。这意味着,当用户离线时,static_taskmanager.php 将显示由 taskmanager.php 在用户在线时返回的最新任务列表。但目前它仅作为一个完全静态的页面工作。
  1. 这是否可能实现?
  2. 我该如何解决这个问题?

编辑

通过在 SO 和 Google 上搜索,我了解到实现这一点的一种方法是使用 AJAX 加载动态内容。但我想知道是否可以仅使用清单文件来完成。

1个回答

1

使用FALLBACK怎么样?

FALLBACK

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

FALLBACK:
/main.php /static.php

使用这个配置,除非用户处于离线状态,否则将提供对/main.php的请求,否则用户将看到/ static.php的最后缓存版本。
请记住,更新服务器上的资产不会触发缓存更新。您必须修改清单文件。在这种情况下,当创建static.php的新版本时,您可能希望在清单中更新版本或时间戳注释。
# Generated: 2015-07-23 10:34a

后续记录

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

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

wget http://example.com/main.php -O main.html

这将把页面内容以HTML格式存储。可以将其作为cron作业运行,每五分钟刷新一次。
另一种选择是每次更新static.php和appcache,这可能会导致所有资源重新加载,从而破坏缓存的目的。

谢谢您的回复。是的,备用方案将解决我的解决方案的整个部分。我还想让static.php与main.php同步。这意味着,每当main.php的内容更改时,我希望它覆盖缓存的static.php(以便始终static.php将显示最新的可能信息)。在客户端是否可以实现这一点? - Aruna Tebel
每次更改main.php时更新时间戳应该会导致浏览器请求清单和static.php的新版本。 - user2182349
实际上,我所说的“更改”主要是指数据库更改。例如:main.php从数据库中打印出动物名称。因此,当它第一次加载时,它将读取动物名称,并且HTML页面将在应用程序缓存中缓存。之后,每次重新加载页面(即使我在线),它都会显示相同的名称集合,即使数据库发生更改。我想要的是跟踪这些数据库更改,通过任何方式同步这些更改,使缓存版本保持最新。我希望你明白我的意思? - Aruna Tebel
你应该发布你的appcache.manifest文件,这样可以更方便别人帮助你。 - user2182349

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接