删除站点的所有缓存页面
Deleting all cached page of the site
场景
手机版和桌面版。
我正在开发一个包含桌面版和移动版的网站:用户可以根据需要选择切换版本:javascript 将保存一个告诉所需版本的 cookie,并将重新加载附加到其 [=33= 的页面] 值“?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 缓存代码中的初始条件将导致浏览器再次从服务器加载页面,但所有其他页面将保持缓存状态。
我的问题
如果所需的站点版本发生变化,有什么方法可以重新加载所有页面?
抱歉,我无法从你的问题中准确判断出你在寻找什么。但是,如果您想确保重新加载页面,有一个非常简单的方法。这是我一直使用的那个,因为 Chrome 似乎喜欢保留缓存页面,即使它们已更改!
在 URL 的末尾添加类似“...?do_reload="+Date.now() 的内容。由于 Date.now() 总是与上次加载文件不同,浏览器将清除缓存并从服务器重新加载文件。
理论上,如果你想在发生变化时重新加载,你可以将其设为 VAR 并将值设置为 false(不重新加载 - 再次假设这已在过去设置)或 Date.now() 如果你确实想清除缓存并重新加载。
老实说,没有比这更容易的了。我花了太多时间来解决这个问题,并在另一个网站上看到了这个答案。希望对你有帮助!
PhilMDev
答案:
在 PHP 中写入一个 JavaScript 变量,其中包含所生成页面的版本(桌面版或移动版)。类似于:echo "var pageVersion = $desktopOrMobile;";
然后在页面加载时添加一个 JavaScript 来比较这个变量和 cookie。如果它们匹配,则一切都很好。如果他们不这样做,您必须重新加载页面。 (类似于:window.location.href = window.location.href + '?nocache=1';
)
如果您想更改同一浏览器的所有选项卡和 windows 中的版本,您甚至可以定期(每秒左右)进行此检查。
免责声明:
我不得不承认我自己还没有尝试过这个,但我很确定这个概念会奏效。
另一种方法是以PHP可以读取的某种方式存储哪个版本在缓存中:要么你必须附加一个像?version=mobile
这样的GET变量到每个URL 或将该信息插入 URL 本身,如 example.net/mobile/foo/bar
或 mobile.example.net/foo/bar
。这样,PHP 可以将缓存中的版本与 cookie 中的所需版本进行比较,并将请求重定向到所需的 URL。
此解决方案不需要 "nocache-hack" 并且可以在没有 JavaScript 的情况下完成,但我相信它会更有效,因为您必须重写所有链接以包含版本或使用一些 URL-重写可能会破坏与其他资源的链接。因此我推荐上面的答案。
如果需要,我会很乐意提供进一步的说明and/or改进我的答案。
旁注:
在我看来,您在这里做了一些非常激进的缓存。
你这样做可能有充分的理由,但如果你开始从数据库加载数据或通过 require
包含其他 PHP 文件,这可能会给你带来很多麻烦,因为你的缓存算法不会注意到这些额外的资源已更改。
场景
手机版和桌面版。
我正在开发一个包含桌面版和移动版的网站:用户可以根据需要选择切换版本:javascript 将保存一个告诉所需版本的 cookie,并将重新加载附加到其 [=33= 的页面] 值“?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 缓存代码中的初始条件将导致浏览器再次从服务器加载页面,但所有其他页面将保持缓存状态。
我的问题
如果所需的站点版本发生变化,有什么方法可以重新加载所有页面?
抱歉,我无法从你的问题中准确判断出你在寻找什么。但是,如果您想确保重新加载页面,有一个非常简单的方法。这是我一直使用的那个,因为 Chrome 似乎喜欢保留缓存页面,即使它们已更改!
在 URL 的末尾添加类似“...?do_reload="+Date.now() 的内容。由于 Date.now() 总是与上次加载文件不同,浏览器将清除缓存并从服务器重新加载文件。
理论上,如果你想在发生变化时重新加载,你可以将其设为 VAR 并将值设置为 false(不重新加载 - 再次假设这已在过去设置)或 Date.now() 如果你确实想清除缓存并重新加载。
老实说,没有比这更容易的了。我花了太多时间来解决这个问题,并在另一个网站上看到了这个答案。希望对你有帮助!
PhilMDev
答案:
在 PHP 中写入一个 JavaScript 变量,其中包含所生成页面的版本(桌面版或移动版)。类似于:echo "var pageVersion = $desktopOrMobile;";
然后在页面加载时添加一个 JavaScript 来比较这个变量和 cookie。如果它们匹配,则一切都很好。如果他们不这样做,您必须重新加载页面。 (类似于:window.location.href = window.location.href + '?nocache=1';
)
如果您想更改同一浏览器的所有选项卡和 windows 中的版本,您甚至可以定期(每秒左右)进行此检查。
免责声明:
我不得不承认我自己还没有尝试过这个,但我很确定这个概念会奏效。
另一种方法是以PHP可以读取的某种方式存储哪个版本在缓存中:要么你必须附加一个像?version=mobile
这样的GET变量到每个URL 或将该信息插入 URL 本身,如 example.net/mobile/foo/bar
或 mobile.example.net/foo/bar
。这样,PHP 可以将缓存中的版本与 cookie 中的所需版本进行比较,并将请求重定向到所需的 URL。
此解决方案不需要 "nocache-hack" 并且可以在没有 JavaScript 的情况下完成,但我相信它会更有效,因为您必须重写所有链接以包含版本或使用一些 URL-重写可能会破坏与其他资源的链接。因此我推荐上面的答案。
如果需要,我会很乐意提供进一步的说明and/or改进我的答案。
旁注:
在我看来,您在这里做了一些非常激进的缓存。
你这样做可能有充分的理由,但如果你开始从数据库加载数据或通过 require
包含其他 PHP 文件,这可能会给你带来很多麻烦,因为你的缓存算法不会注意到这些额外的资源已更改。