【问题标题】:Force refresh of modified JS & CSS file in cakephp强制刷新 cakephp 中修改后的 JS 和 CSS 文件
【发布时间】:2015-09-15 16:20:21
【问题描述】:

我只阅读了有关 cakephp 缓存文件的两个选项:

  • 而是将它们全部缓存
  • 或者您不缓存任何内容。

我想要介于两者之间的东西。使用版本参数,与我们在任何其他网站上所做的相同:

script.js?v=2

通过这种方式,我们可以手动甚至自动强制加载修改过的文件,同时在没有对其进行更改时将其缓存。

【问题讨论】:

    标签: php cakephp cakephp-3.0


    【解决方案1】:

    CakePHP 提供了一种将时间戳应用于 CSS 和 JS 文件等资产的方法,该方法仅在文件更改时刷新。这相当于执行 'script.js?v=2',Cake 会生成类似 'script.js?1442387965' 的 URL。

    在 CakePHP 3.x 中(在 config/app.php 中):-

    'Asset' => [
        'force'
    ]
    

    在 CakePHP 2.x 中(在 app/Config/core.php 中):-

     Configure::write('Asset.timestamp', 'force');
    

    如果您只想在启用调试模式时应用时间戳,请将上述设置为 true 而不是 force

    【讨论】:

    • 这样做是有代价的,就像 CakePHP checks the filemtime for each asset to generate that timestamp。考虑到覆盖该方法以使用Configure::read('Site.version') 或类似方法的问题,这可能是一个更好的主意。注意using query args may affect intermediary caches.
    • @AD7six 同意这是有代价的,实际上我们发现这可以忽略不计。使用不需要浏览器刷新缓存的修改资产推出生产站点更新也不存在风险。为清楚起见,Cake 中此设置旁边的注释可能会突出显示性能成本。
    • 为什么这是一个公认的答案?使用时间戳和版本控制是有区别的。 'script.js?v=2' 会缓存你的 js 或 css 而强制时间戳不会。
    • @MainPalYadav 此方法只会让浏览器获取资产的新副本,前提是它已被修改,因为时间戳是根据资产上次修改的时间生成的。如果不确定,请检查 CakePHP 代码
    • 至少从 CakePHP 3.7.7 开始,列出的代码不会产生预期的结果。以下配置确实生成强制时间戳,添加到 app.php 中的 'Asset' 键中:'Asset' => [ 'timestamp' => 'force' ]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多