PHP内容缓存用于JavaScript和CSS

3

我有一个独特的问题,使用谷歌证明难以解决。我正在将所有的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文件扩展名,Web浏览器将“看到”这是一个动态页面,然后每次加载站点上的页面时都会重新请求内容。我正在尝试做的是获取浏览器最后一次请求的时间,然后检查每个文件的修改时间,以确定是否真的需要再次发送文件内容。目前很难找到用户最后一次请求的时间。此外,我还没有开始解决如何找到所包含文件的最后修改日期的问题,因此如果有关于在服务器上查找文件详细信息的信息,那也将不胜感激。
只是为了明确,我这样做的原因是(我认为)它比单独的gzip文件更好地利用了gzip压缩。
提前致谢。

Minify - http://code.google.com/p/minify/ - 是一个库,旨在满足此处所需的功能-将文件连接起来并发送适当的标头,同时减小内容的大小,很可能进行gzip压缩,并将结果缓存在磁盘上。 - Alister Bulman
我考虑过只进行连接和压缩,但是我想要保留一些动态控制内容的能力,尤其是在我仍在开发网站并不断更改代码时。 - Scott M.
5个回答

3
我写了一系列关于这个问题的文章。请参见在PHP中加速Javascript在PHP中加速CSS。这些文章涵盖了以下内容:
  • 合并文件;
  • 最佳Gzip实践;
  • 最佳缓存实践;以及
  • 版本输出。

我曾经使用过那个解决方案,但当我发现http://code.google.com/p/minify/时,我就放弃了它。虽然这是一个很好的入门解决方案,但是在易用性和实现方面,minify要好得多,更不用说有很多功能,比如分组等。 - Adil

2
你的前提是错误的。浏览器不会“看到”PHP文件扩展名并决定不缓存内容。请参见http://www.enhanceie.com/redir/?id=httpperf,了解浏览器的实际工作方式。
你应该在响应中设置ETAG,然后可以简单地检查If-None-Match请求头,并在内容未更改时返回304。

+1。不过更简单的方法是避免通过PHP提供脚本和样式表。这样做并没有真正的好处。 - bobince
@bobince:当然有。减少HTTP请求。 - mpen
马克说得对。我想利用压缩和减少HTTP请求的优势。 - Scott M.
JS-min(http://github.com/rgrove/jsmin-php)可以设置为将最终版本连接、压缩并存储到磁盘上,根据需要输出它,并在必要时重新构建缓存。 - Alister Bulman

0

Alister Bulman刚刚提到了一个很棒的库解决方案,但是他把它放在了评论中。我将他的评论重复为答案,因为我发现它非常有价值:

Minify - code.google.com/p/minify - 是一个专门设计用于执行所需操作的库 - 连接文件并发送适当的标头,同时缩小内容,并很可能对其进行gzip压缩,同时在磁盘上缓存结果。- Alister Bulman Jan 10 '10 at 10:44


0
浏览器不是通过扩展名来确定页面或文件是动态的还是静态的,而是通过其头部信息。只需设置适当的头部信息,使浏览器知道它可以缓存结果。
此外,放弃使用闭合标签?>。这不是必需的,也是不好的做法。

除非您嵌入大量的HTML或其他内容,否则不需要这样做。如果您包含一个在结束标签后有空格的文件,则可能会导致一些令人讨厌的“头已发送”错误。 - Htbaa
1
对于仅包含 PHP 代码的文件,不允许使用结束标记("?>")。PHP 不需要它,并省略它可以防止在响应中注入尾随空格。 - Htbaa
我不同意将?>视为不好的做法。虽然我同意你对问题的答案。我认为明确分隔PHP代码要更加清洁,即使这可以被隐式地完成。 - Myles
3
“?>”并不是必需的,但我完全不同意称其为“糟糕”。如果不使用它,它不会使您的页面加快加载速度。至于空格滑入的问题,在过去的5-6年中我还没有遇到过这个问题。 - JasonDavis
@Myles:如果它是 100% PHP,就没有什么可以区分的了。 - mpen
1
我认为如果文件是100%的PHP,那是一种不好的做法。至于在过去几年中你没有遇到这种情况,我可以理解因为你使用自己的代码。但是当使用别人的库时,这个错误可能会很容易地悄悄出现。这只是一种非常麻烦的bug。 - Htbaa

-1

您可以使用Apache mod_deflate启用文件的自动gzip压缩。

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

类似于以下内容:

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

将此代码放置在您的目录中的 .htaccess 文件中。

实际问题与文件扩展名无关,这是 URL 的不透明部分,浏览器不关心。重要的是缓存控制/过期/etag 标头。 - bobince

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接