【问题标题】:PHP content caching for javascript and css用于 javascript 和 css 的 PHP 内容缓存
【发布时间】:2011-01-03 09:08:02
【问题描述】:

我有一个独特的问题,使用谷歌很难解决。我将我所有的 javascript 和 css 合并到单独的 php 文件中,这些文件使用 require_once() 来提取文件的内容。javascript 文件看起来像这样:

<?php
header('Content-Type: text/javascript');
require_once('jquery.form.js');
require_once('jquery.jqtransform.js');
require_once('jquery.validate.js');
?>

我的具体问题是,由于 php 文件扩展名,网络浏览器会“看到”这是一个动态页面,然后在每次加载网站上的页面时重新请求内容。我要做的是从浏览器获取上次请求的时间,然后检查每个文件修改时间,看看我是否真的需要发送文件内容再次。事实证明,很难找到用户最后一次请求的时间。另外,我还没有开始解决查找所包含文件的最后修改日期的问题,所以如果有关于在服务器上查找文件的文件详细信息的信息,那将也值得赞赏。

为了清楚起见,我这样做的原因是(我认为)它比单独的 gzip 压缩文件更好地利用 gzip 压缩。

提前致谢

【问题讨论】:

  • Minify - code.google.com/p/minify - 是一个库,旨在执行此处所需的操作 - 连接文件并发送适当的标头,还修剪内容,很可能压缩它们,同时缓存结果在磁盘上。
  • 我想过只是连接和缩小,但我想保留对内容的一些动态控制,尤其是当我仍在开发网站并不断更改我的代码时。

标签: php javascript css caching


【解决方案1】:

Alister Bulman 刚刚提到了一个针对这个问题的简洁的库解决方案,但将其作为评论放置。我重复他的评论作为答案,因为我发现它很有价值:

Minify - code.google.com/p/minify - 是一个旨在做什么的库 此处需要 - 连接文件并发送适当的 标题,还修剪内容,很可能是 gzip 它们,同时将结果缓存在磁盘上。 – 阿利斯特布尔曼 2010 年 1 月 10 日 10:44

【讨论】:

    【解决方案2】:

    你的前提不正确。浏览器不会“看到” PHP 文件扩展名并决定不缓存内容。请参阅http://www.enhanceie.com/redir/?id=httpperf 了解浏览器的实际工作原理。

    您应该在响应中设置一个 ETAG,然后您可以简单地检查 If-None-Match 请求标头,如果内容未更改,则返回 304。

    【讨论】:

    • +1。虽然更容易避免通过 PHP 提供脚本和样式表。它没有真正的优势。
    • @bobince:当然有。更少的 HTTP 请求。
    • 马克说得对。我想利用压缩和更少的 http 请求
    • JS-min (github.com/rgrove/jsmin-php) 可以设置为连接、压缩和存储最终版本在磁盘上,根据需要输出,并在需要时重建缓存。
    【解决方案3】:

    我专门写了一系列关于这个问题的帖子。请参阅 Supercharging Javascript in PHPSupercharging CSS in PHP。这些包括:

    • 合并文件;
    • Gzip 最佳实践;
    • 缓存最佳实践;和
    • 版本控制输出。

    【讨论】:

    • 我开始使用该解决方案,但当我找到code.google.com/p/minify 时,我离开了它。虽然这是一个很好的入门解决方案,但 minify 在易用性和实施​​方面要好得多,更不用说还有很多功能,例如分组等。
    【解决方案4】:

    浏览器不会通过扩展名来确定页面或文件是动态的还是静态的。它的标题可以。只需设置正确的标头,以便浏览器知道它可以缓存结果。

    另外,放弃结束?&gt;。这不是必需的,而且是不好的做法。

    【讨论】:

    • 除非您嵌入 HTML 的大部分内容,或者其他任何内容,否则您不会。如果您包含的文件在结束标记后有一个空格,则可能会导致一些烦人的“标头已发送”错误。
    • "对于只包含 PHP 代码的文件,关闭标签 ("?>") 是不允许的。PHP 不需要它,省略它可以防止意外注入尾随空格回复。" 来源:framework.zend.com/manual/en/…
    • 我不同意 ?> 是不好的做法。尽管我同意您对 OPs 问题的回答。我认为显式地描述你的 PHP 代码要干净得多,即使它可以隐式地完成。
    • ?> 不是必需的,但我也 100% 不同意将其称为坏的。不使用它根本不会加速您的页面。至于空格滑入,我在 5-6 年内还没有遇到过这个问题
    • 如果文件是 100% PHP,我认为这是不好的做法。至于在过去几年里没有发生在你身上,我可以用你自己的代码来理解。但是当使用别人的库时,这个错误很容易溜进来。很难找到这种错误。
    【解决方案5】:

    您可以使用 apache mod_deflate 启用文件的自动 gzip。

    您还可以使用 apache mod_rewrite 将 html 中的这些文件引用为 js 文件,并将请求重定向到 php 文件,避免您的服务器缓存问题。

    类似这样的:

    RewriteEngine On
    RewriteRule (.*).js $1.php
    

    将此代码放入目录中的 .htaccess 文件中。

    【讨论】:

    • 实际问题与文件扩展名无关,这是浏览器不关心的URL的不透明部分。重要的是 cache-control/expires/etag 标头。
    猜你喜欢
    • 1970-01-01
    • 2012-08-24
    • 2018-04-07
    • 1970-01-01
    • 2013-01-05
    • 2014-07-27
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多