Eva*_*van 8 html php caching backbone.js backbone-boilerplate
因此,我们正在每周发布我们的项目,并且我们遇到的问题是客户端有旧版本的某些文件.
堆栈是主干,带有主干样板的requirejs和带有PHP后端的Apache2服务器.
我们有加载的索引html文件,使用AJAX加载的模板HTML文件,然后是所有js文件.
这个问题似乎与/sf/ask/847233901/有关,但我没有看到一个好的答案.
我听说PHP的缓存控制头和mod过期以及mod头可能会有所帮助,但我不知道如何将它们放在一起.
从本质上讲,我们要做的是确保向prod服务器发布新代码,确保所有内容都不会被缓存一次.在此之后,正常缓存以提高加载速度将是理想的.
至少,我会理解如何完全阻止这些东西被缓存.
有任何想法吗?
就缓存而言,我发现很难控制用户客户端的浏览器.我过去使用的一个技巧是在我的JS文件URL中附加一个随机数.喜欢
<script src="https://www.mydomain.com/myjsfile.js?123456789"></script>
Run Code Online (Sandbox Code Playgroud)
要么
<script src="https://www.mydomain.com/myjsfile.js?releaseID=123456789"></script>
Run Code Online (Sandbox Code Playgroud)
这导致客户端将其视为一个新文件.您可以为每个版本分配一个随机数,这应该会导致用户的浏览器再次提取新的JS文件.同样适用于CSS.
我希望这有帮助.祝好运.
客户端文件的缓存由两个值定义:<head>
被调用的html文件的-section中的元信息和HTTP-Header.
在HTML文件中,您可以给出两个元标记, cache-control
并expires
通过提供简单的php命令来定义每周过期日期:
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="PRIVATE">
<?php
$daysDelta = 7-date("w");
$expiration = date(DATE_RFC1123, mktime(0, 0, 0, date("m"),
date("d")+$daysDelta+1, date("Y")));
?>
<META HTTP-EQUIV="EXPIRES" CONTENT="<?= $expiration ?>">
Run Code Online (Sandbox Code Playgroud)
这会在星期一早上杀死缓存.另一种方法是通过HTTP-Header进行缓存设置:
<?php
header("Cache-Control: private");
header("Expires: <?= $expiration ?>");
?>
Run Code Online (Sandbox Code Playgroud)
使用这两种方法,您将在一周内进行缓存,但在周末之后,客户端将使其缓存无效并重新生成数据.
要从页面中删除缓存,您需要将其包含在页面顶部: -
$this->output->set_header("Expires: Tue, 01 Jan 2000 00:00:00 GMT");
$this->output->set_header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
$this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
$this->output->set_header("Cache-Control: post-check=0, pre-check=0", false);
$this->output->set_header("Pragma: no-cache");
Run Code Online (Sandbox Code Playgroud)