使用"AddHandler应用程序/x-httpd-php"缓存问题


Caching problem using "AddHandler application/x-httpd-php"

使用。htaccess,我将PHP处理程序设置为所有的。css和。js,以便输出基于用户代理的代码:

 AddHandler application/x-httpd-php .css .js
例如:

<?PHP if ($CurrentBrowser == 'msie') { ?>
.bind('selectstart', function(event) { ... })
<?PHP } ?>

因此,实际上,我的代码文件是动态创建的,但可以认为是静态文件。这是因为,一旦它们第一次被编译,浏览器可以从缓存中获取它们并重用它们,直到我更改它们的内容。这就是为什么我使用指纹/版本控制和长时间过期:

[INDEX.PHP]
<script type="application/javascript" src="<?PHP echo GetVersionedFile('/script.js'); ?>"></script>
<script type="application/javascript" src="/script.1316108341.js"></script>
[.HTACCESS]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule "^(.+)'.('d+)'.(css|js)$" $1.$3 [L]

问题是,这些文件,即使我发送一个适当的头,从来没有被任何浏览器缓存(我从来没有得到一个304代码,总是200)。这是我的服务器响应日志:

[CHROME]
Request URL:http://127.0.0.1:8888/script.1316108341.js
Request Method:GET
Status Code:200 OK
-----
Cache-Control:max-age=31536000, public
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:6150
Content-Type:application/javascript
Date:Thu, 15 Sep 2011 21:41:25 GMT
Expires:Fri, 14 Sep 2012 21:41:25 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.2.17 (Win32) PHP/5.3.6
Vary:Accept-Encoding
X-Powered-By:PHP/5.3.6
[MOZILLA]
Request URL:http://127.0.0.1:8888/script.1316108341.js
Request Method:GET
Status Code:200 OK
-----
Date Thu, 15 Sep 2011 21:43:26 GMT
Server Apache/2.2.17 (Win32) PHP/5.3.6
X-Powered-By PHP/5.3.6
Content-Encoding gzip
Vary Accept-Encoding
Cache-Control max-age=31536000, public
Expires Fri, 14 Sep 2012 21:43:26 GMT
Content-Type application/javascript
Content-Length 6335
Keep-Alive timeout=5, max=100
Connection Keep-Alive
-----
Last Modified Thu Sep 15 2011 23:43:26 GMT+0200 (= time i loaded the page) (???)
Last Fetched Thu Sep 15 2011 23:43:26 GMT+0200 (= time i loaded the page) (???)
Expires Fri Sep 14 2012 23:43:26 GMT+0200
Data Size 6335
Fetch Count 10
Device disk

有什么问题吗?如何对这些文件强制进行缓存?非常非常感谢!

由于PHP正在处理对PHP和CSS文件的请求,因此每次都要执行附带条件的PHP代码。

Apache/PHP不知道内容是否可缓存,或者是否应该重新生成,所以它每次都执行PHP代码。

如果您发送最后修改的头,或使用版本控制/指纹方法,那么在PHP脚本中检查指纹或版本并确定它是否仍然有效是您的责任。如果是这样,那么您可以发送一个304 Not Modified标头并终止任何进一步的处理。你也可以检查Last-Modified标签的请求头,并使用该方法。

另一种方法是将各种浏览器和日期的响应缓存到一个文件中,这样您就可以为第一次使用该文件的用户提供该文件,而不是使用php重新生成该文件。然后,您可以检查该文件的修改时间,以确定是否可以发送304标头。

这篇SitePoint文章解释了几种使用PHP缓存的方法。