【问题标题】:Auto versioning static content自动版本控制静态内容
【发布时间】:2009-10-12 19:34:55
【问题描述】:

我正在开发一个 PHP 站点,该站点提供来自无 cookie 域的静态内容(感谢 SO 博客!),该域提供具有高缓存的内容,这意味着我无法更改内容(JS、 CSS 和图像)而不会使缓存失效。目前我通过将 ?revision(例如 style.css?19)附加到静态 URL 的末尾来执行此操作,目前我正在手动执行此操作,这显然很不方便。

完成此任务的推荐方法是什么?我正在使用 Subversion,据我了解,我可以使用各种工具来获取修订号 - 但是我将如何将它导入 PHP(在每个页面加载时运行它似乎不是很明智?)。我猜我很可能应该使用某种构建系统。

任何建议将不胜感激。

谢谢

【问题讨论】:

    标签: php svn static


    【解决方案1】:

    SVN keyword substitution 可能是解决方案。您可以这样使用它:首先将以下代码添加到您的 PHP 代码中,靠近您要使用该版本的地方。像这样:

    $svn_version = '$Revision$'; // remember to use single quotes!
    

    现在提交该文件。然后重新打开它。观察上面的行现在看起来像这样:

    $svn_version = '$Revision: 66232 $';
    

    SVN 识别出关键字标签并将其替换为修订号。从现在开始,每次提交该文件时,此标签都会更新为最新的版本号,它还会在您执行签出或导出时包含版本号。

    现在,您只需对字符串进行一些操作即可从该字符串中取出该数字。我相信你可以自己弄清楚。

    当然,当您在不接触 PHP 的情况下更新实际的 css/js 文件时,这是行不通的。而这并不能轻易解决。每次更改 CSS/JS 时都可以更改 PHP。或者是的,你可以选择一些构建系统。

    无论如何,我希望你能从中得到一些想法。

    【讨论】:

    • 感谢Anti的想法,但正如您所说,PHP文件也必须更新,通常情况并非如此(有10个文件引用静态内容);我也可以手动编辑数字。
    • 但是,如何将当前时间戳添加到静态 URL 的末尾?这将有效地绕过缓存。
    • 当前时间戳?但是每次页面加载时缓存都会失效,我只希望在静态内容实际发生变化时对其进行更改。
    【解决方案2】:

    有一个出色的PHP script 和一组 .htaccess,可用于 CSS / Javascript 文件的版本控制。它通过将所有 CSS / JS 请求重写到文件 combine.php 来工作,然后检查文件是否已被修改。如果有,它会创建文件的新缓存版本。如果它没有被修改,它可以简单地发送一个以前缓存的文件版本。该脚本还有一个好处是可以最大限度地减少 http 请求的数量,这是另一个性能改进。

    图像更难 - 在基本级别上,您可以通过 css 文件搜索/替换图像名称并更新它们。这可以合并到构建脚本中。 SASS 是一个 CSS 处理系统,支持 CSS 中的变量,这意味着您只需要在一个地方更新图像名称。

    最后,我注意到在使用Fiddler之类的工具时,如果请求中包含查询字符串,浏览器可以忽略过期标头并联系服务器,因此最好放在子目录中, 即代替

    /css/main.css?16
    
    /css/16/main.css
    

    【讨论】:

      【解决方案3】:

      一个想法是拥有一个仅包含一个数字(即修订号)的文本文件。每次更新,您都会增加这个数字(作为 SVN 版本 ID 或只是一个计数器,根据需要)。

      所以你只需要按照你的建议进行;您读取文件中的数字,并将其作为 GET 参数传递给您的 CSS 或其他文件。一个实现,你只需要更新修订号(如果你使用它,可能会清理缓存)以更新每一页。很简单:)

      【讨论】:

        猜你喜欢
        • 2011-02-07
        • 2011-05-25
        • 1970-01-01
        • 1970-01-01
        • 2013-03-07
        • 1970-01-01
        • 2012-02-26
        • 1970-01-01
        相关资源
        最近更新 更多