如何为骨干项目控制PHP,标题等版本的缓存?

Eva*_*van 8 html php caching backbone.js backbone-boilerplate

因此,我们正在每周发布我们的项目,并且我们遇到的问题是客户端有旧版本的某些文件.

堆栈是主干,带有主干样板的requirejs和带有PHP后端的Apache2服务器.

我们有加载的索引html文件,使用AJAX加载的模板HTML文件,然后是所有js文件.

这个问题似乎与/sf/ask/847233901/有关,但我没有看到一个好的答案.

我听说PHP的缓存控制头和mod过期以及mod头可能会有所帮助,但我不知道如何将它们放在一起.

从本质上讲,我们要做的是确保向prod服务器发布新代码,确保所有内容都不会被缓存一次.在此之后,正常缓存以提高加载速度将是理想的.

至少,我会理解如何完全阻止这些东西被缓存.

有任何想法吗?

Bry*_*llo 6

就缓存而言,我发现很难控制用户客户端的浏览器.我过去使用的一个技巧是在我的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.

我希望这有帮助.祝好运.


Lar*_*ars 5

客户端文件的缓存由两个值定义:<head>被调用的html文件的-section中的元信息和HTTP-Header.

在HTML文件中,您可以给出两个元标记, cache-controlexpires通过提供简单的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)

使用这两种方法,您将在一周内进行缓存,但在周末之后,客户端将使其缓存无效并重新生成数据.


Sac*_*sad 5

要从页面中删除缓存,您需要将其包含在页面顶部: -

$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)


nxt*_*rld 5

对于requirejs,有一个名为urlargs的参数,它为所有requirejs请求添加一个参数,并可用于强制缓存更新.页面上的示例使用时间戳,但您可能正在寻找构建版本.

但是,您应该使用r.js来构建脚本的生产版本(它编译并缩小所有加载了require的文件并生成一个库).这将减少加载时间并为您节省很多后顾之忧.您可以将它们链接到这一个库,并在文件名本身中使用构建版本(类似backbone.app.1.0.23456.js).