缓存遇到问题…
我使用这个php文件与url重写压缩和缓存css和js
我的印象是,如果我改变/更新我的一个文件,浏览器会检索更新的文件。但它不会,除非我清除缓存或刷新页面。
我的编码错了吗?或者浏览器不应该得到更新的内容,直到缓存过期?
<?php
$file = $_SERVER['DOCUMENT_ROOT'].'/'.$_GET['file'];
$last_modified_time = filemtime($file);
$etag = md5_file($file);
$expires = 60*60*24*7;
if(file_exists($file))
{
if($_SERVER['HTTP_IF_NONE_MATCH'] != $etag)
{
header("Pragma: public");
header("Cache-Control: maxage=$expires, must-revalidate");
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expires) . ' GMT');
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");
header("Etag: '"{$etag}'"");
if($_GET['type'] == 'js') header('Content-type: application/javascript');
if($_GET['type'] == 'css') header('Content-type: text/css');
if($_GET['type'] == 'ico') header('Content-type: image/x-icon');
ob_start("ob_gzhandler");
include($file);
}
else {
header('HTTP/1.0 304 Not Modified');
}
}
else {
header("HTTP/1.0 404 Not Found");
}
?>
重写规则RewriteRule ^(.*).js$ /compress.php?file=$1.js&type=js [L,QSA]
RewriteRule ^(.*).css$ /compress.php?file=$1.css&type=css [L,QSA]
RewriteRule ^(.*).ico$ /compress.php?file=$1.ico&type=ico [L,QSA]
---------
编辑:也许我应该这样做一个不同的方式?大公司使用什么来缓存,他们如何强制浏览器在缓存过期之前获取更新的内容?
编辑2:谢谢家伙的帮助。我要用1小时的缓存
浏览器不会刷新缓存文件,直到给定的Expires
标头过期。如果它过期了,它会用If-None-Match
头请求文件(我猜)。
但是为什么不通过.htaccess
处理缓存控制呢?您可以查看mod_expires
:
# Expires-Header
ExpiresActive On
ExpiresByType application/javascript "access plus 7 days"
ExpiresByType text/css "access plus 7 days"
# ETag
FileETag All
Gzip压缩以及mod_deflate
:
AddOutputFilterByType DEFLATE text/css application/javascript
编辑:'大公司'不使用Expires
或max-age
头,或者他们会设置这些头让缓存文件约1小时->与缓存的冲突将被最小化。
你错过了这些部分,我相信…
$last_modified = filemtime($file);
// Check for cached version
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) OR isset($_SERVER['HTTP_IF_NONE_MATCH']))
{
// these part should do that...
if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == gmdate('D, d M Y H:i:s 'G'M'T', $last_modified))
{
header('HTTP/1.0 304 Not Modified');
return;
}
}
header('Last-Modified : '.gmdate('D, d M Y H:i:s 'G'M'T', $last_modified));
header('Cache-Control : max-age='.$expires.', must-revalidate');
header('Expires : '.gmdate('D, d M Y H:i:s 'G'M'T', $last_modified + $expires));
// and so on...
顺便说一句,帮助你确定,更多,相关如何你的缓存性能,甚至更好,你的整个应用程序的性能,你可以通过使用谷歌API性能测试它,或这些网站:http://www.webpagetest.org/(PS:只是例如,这些是我的最新结果为我的工作博客:http://www.webpagetest.org/result/110803_SB_17PVH/)
是的,理论上浏览器应该注意你发回的Cache-Control
, Expires
等信息,但在实践中,信任浏览器做正确的事情并不总是一个好主意。
你可能要考虑做的是在你的压缩。php脚本中添加第二步…让它重定向到实际的压缩文件,并将"?ts=".$last_modified_time
之类的内容附加到文件的路径。这样,当文件更改时,URL也会更改,浏览器将更有可能做正确的事情并获取最新的文件。我以前用过类似的方法