用于javascript和css的PHP内容缓存

用于javascript和css的PHP内容缓存,php,javascript,css,caching,Php,Javascript,Css,Caching,我有一个独特的问题,这是证明难以解决使用谷歌。我正在将所有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.valida

我有一个独特的问题,这是证明难以解决使用谷歌。我正在将所有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');
?>
RewriteEngine On
RewriteRule (.*).js $1.php

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

我这么做的原因是(我认为)它比单独的gzip文件更好地利用了gzip压缩


提前感谢

您可以使用apache mod_deflate启用文件的自动压缩

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

大概是这样的:

<?php
header('Content-Type: text/javascript');
require_once('jquery.form.js');
require_once('jquery.jqtransform.js');
require_once('jquery.validate.js');
?>
RewriteEngine On
RewriteRule (.*).js $1.php

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

您的前提不正确。浏览器无法“看到”PHP文件扩展名,因此决定不缓存内容。有关浏览器实际工作方式的信息,请参阅


您应该在响应上设置一个ETAG,然后只需检查If None Match请求头,如果内容未更改,则返回304。

浏览器不会根据扩展名确定页面或文件是动态的还是静态的。它的标题可以。只需设置适当的标题,让浏览器知道它可以缓存结果


此外,请不要关闭
?>
。这不是必需的,是一种不好的做法。

我专门写了一系列关于这个问题的帖子。见和。这些措施包括:

  • 合并文件
  • gzip最佳实践
  • 缓存最佳做法;及
  • 版本控制输出

Alister Bulman刚刚提到了一个用于解决此问题的简洁库解决方案,但将其作为评论。我重复他的评论作为回答,因为我觉得它很有价值:

Minify-code.google.com/p/Minify-是一个库,设计用来做什么 此处需要-连接文件并发送适当的 页眉,也修剪了内容,很可能是gzip 在将结果缓存到磁盘上时Alister Bulman 1月10日'10 10点44分


除非你嵌入了HTML的大部分,否则你不会。如果在结束标记后包含一个空格的文件,则可能会导致一些恼人的“已发送的标题”错误。对于仅包含PHP代码的文件,永远不允许使用结束标记(“?>”)。PHP不需要它,省略它可防止在响应中意外注入尾随空格。”资料来源:我不同意这种做法。虽然我同意你对老年退休金问题的回答。我认为显式描述PHP代码要干净得多,即使它可以隐式完成。?>不是必需的,但我也100%不同意将其称为坏代码。如果不使用它,它根本不会加快你的页面速度。至于空白空间,我在5-6年还没有遇到这个问题。如果文件是100% php,我认为这是一个糟糕的做法。至于这在过去几年中没有发生在您身上,我可以通过您自己的代码理解这一点。但是,当使用其他库时,这个错误很容易被忽略。这只是一个让人头疼的bug。实际问题与文件扩展名无关,而文件扩展名是URL浏览器不关心的不透明部分。重要的是缓存控制/expires/etag头。+1。尽管更容易避免通过PHP提供脚本和样式表。这没有什么真正的好处。@bobince:当然有。更少的HTTP请求。马克说得对。我想利用压缩和更少的http requestsJS min()可以被设置为连接、压缩并将最终版本存储在磁盘上,根据需要输出,并在需要时重建缓存。Minify--是一个库,用于执行此处所需的操作-连接文件并发送适当的头,在将结果缓存到磁盘上的同时,也会对内容进行精简,很可能是gzip。我只想进行连接和缩小,但我想保留对内容的一些动态控制,尤其是当我还在开发网站,不断修改代码的时候。我开始使用这个解决方案,但当我发现我离开了它。虽然这是一个很好的入门解决方案,但minify在易用性和实现方面要好得多,更不用说还有很多功能,如分组等。