php - 删除网站的所有缓存页面

标签 php javascript cross-platform caching

场景

移动和桌面版本。
我正在开发一个具有桌面和移动版本的网站:用户可以选择切换版本(如果他们愿意):javascript 将保存一个 cookie 告诉所需的版本,并将重新加载页面,并在其 url 上附加值“?nocache=1” ”。
页面缓存。
使用以下 PHP 代码缓存页面:

<?php
$lastModified=filemtime(__FILE__);
$etagFile = md5_file(__FILE__);
if(empty($_GET['nocache'])){
    $ifModifiedSince=(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false);
    $etagHeader=(isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false);
    header("Last-Modified: ".gmdate("D, d M Y H:i:s", $lastModified)." GMT");
    header("Etag: $etagFile");
    header('Cache-Control: public');
    if (strtotime($ifModifiedSince)==$lastModified || $etagHeader == $etagFile){
        header("HTTP/1.1 304 Not Modified");
        exit;
    }
}
?>

问题

如果用户更改站点版本,PHP 代码中缓存的初始条件将导致浏览器再次从服务器加载页面,但所有其他页面将保持缓存。

我的问题

如果所需的网站版本发生更改,有什么方法可以重新加载所有页面吗?

最佳答案

回答

在 PHP 中编写一个 JavaScript 变量,其中包含所生成页面的版本(桌面版或移动版)。类似于:echo "var pageVersion = $desktopOrMobile;";

然后在页面加载时添加一个 JavaScript,用于比较该变量和 cookie。如果它们匹配,则一切都很好。如果没有,您必须重新加载页面。 (类似于:window.location.href = window.location.href + '?nocache=1';)

如果您想更改同一浏览器的所有选项卡和窗口中的版本,您甚至可以定期(每秒左右)执行此检查。

免责声明

我必须承认我自己还没有尝试过,但我很确定这个概念会起作用。

另一种方法是以 PHP 可以读取的方式存储缓存中的版本:要么必须将 ?version=mobile 之类的 GET 变量附加到每个 URL,要么插入该变量信息放入 URL 本身,例如 example.net/mobile/foo/barmobile.example.net/foo/bar。这样,PHP 就可以将缓存中的版本与 cookie 中所需的版本进行比较,并将请求重定向到所需的 URL。

此解决方案不需要“nocache-hack”,并且可以在没有 JavaScript 的情况下完成,但我相信这会需要更多工作,因为您必须重写所有链接以包含版本或使用一些 URL 重写,这可以断开与其他资源的链接。因此我推荐上面的答案。

如果需要,我很乐意提供进一步的说明和/或改进我的答案。

旁注

在我看来,你在这里做了一些非常积极的缓存。 您这样做可能有充分的理由,但如果您开始从数据库加载数据或通过 require 包含其他 PHP 文件,这可能会给您带来很多麻烦,因为您的缓存算法不会注意到这些附加资源是否已存在已更改。

关于php - 删除网站的所有缓存页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28546241/

相关文章:

PHP,mysql - 使用 json_encode 中的 for 循环获取数据库表中的数据

php - 有没有办法重新分配 $this?

javascript - 将附件上传到 Wordpress 中的页面

javascript - odoo中如何调用网站端widget

javascript - div 内的曲线 Angular 图像问题

javascript - Node - 跨平台编译 - PKG

php - INSERT 结果为 KEY PRIMARY 的重复条目 '0'

android - 打开特定应用的权限设置 flutter ?

java - 跨平台开发建议

javascript - IBM Worklight - 适配器部署失败 : Adapter 'BIIOwnAccountFundTransferAdapter.xml' contains errors