Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何控制主干项目的PHP版本、标题等的缓存?_Php_Html_Caching_Backbone.js_Backbone Boilerplate - Fatal编程技术网

如何控制主干项目的PHP版本、标题等的缓存?

如何控制主干项目的PHP版本、标题等的缓存?,php,html,caching,backbone.js,backbone-boilerplate,Php,Html,Caching,Backbone.js,Backbone Boilerplate,因此,我们每周发布一次我们的项目,我们遇到了一些问题,客户使用的是某些文件的旧版本 堆栈是主干,带有带主干样板的requirejs和带PHP后端的Apache2服务器 我们有加载的索引html文件,使用AJAX加载的模板html文件,然后是所有js文件 这个问题似乎与我的想法有关,但我没有看到一个好的答案 我听说PHP的缓存控制头、mod expires和mod headers可能会有所帮助,但我不知道如何将它们放在一起 本质上,我们要做的是确保在向prod服务器发布新代码时,所有内容都不会缓存

因此,我们每周发布一次我们的项目,我们遇到了一些问题,客户使用的是某些文件的旧版本

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

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

这个问题似乎与我的想法有关,但我没有看到一个好的答案

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

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

至少,我想知道如何完全防止这些东西被缓存


有什么想法吗?

就缓存而言,我发现很难控制用户客户端的浏览器。我过去使用的一个技巧是在我的JS文件URL中附加一个随机数。像

<script src="https://www.mydomain.com/myjsfile.js?123456789"></script>


这会导致客户端将其视为一个新文件。您可以为每个版本分配一个随机数,这将导致用户的浏览器再次提取新的JS文件。CSS也是如此


我希望这有帮助。祝你好运。

客户端文件的缓存由两个值定义:被调用html文件的
-部分中的元信息和HTTP头

在HTML文件中,您可以提供两个
缓存控制
过期
来定义每周过期日期,方法是提供一个简单的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 ?>">


要从页面中删除缓存,您需要在页面顶部包含以下内容:-

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

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


但是,您应该使用r.js来构建脚本的生产版本(它编译并缩小所有使用require加载的文件,并生成单个库)。这将减少加载时间,并为您节省很多担心。您可以让它们只链接这一个库,并在文件名中包含构建版本(类似于backbone.app.1.0.23456.js)。

向uri添加随机数会破坏客户端缓存。
而是追加文件的上次修改时间


requireJS实际上为JS文件提供了一种很好的处理方法,但它似乎不是一个足够好的解决方案
<?php
    header("Cache-Control: private");
    header("Expires: <?= $expiration ?>");
?>
$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");
<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresByType text/css                  "access plus 1 year"
  ExpiresByType application/javascript    "access plus 1 year"
</IfModule>