HTML静态画面-反向代理缓存和浏览器缓存使用和原理分析

1.有时为了让前台加速访问或者让变化不频繁的页面进行缓存,可以在后台代码进行设定header返回cache时间。

// 获取文章列表,文章改动不频繁的情况进行前端画面缓存
$articles = $query->getResult();
  
$response = new Response();

// mark the response as either public or private
$response->setPublic();
//$response->setPrivate();
// set the private or shared max age
//$response->setMaxAge(600);
$response->setSharedMaxAge(60);
// set a custom Cache-Control directive
$response->headers->addCacheControlDirective('must-revalidate' , true);

//make cache stale
//$response->expire();

//force response 304
//$response->setNotModified();

//set vary header
$response->setVary(array('Accept-Encoding' , 'User-Agent' ));

设置这个文章列表页面的缓存有效期是60s,是public ,反向代理缓存可以存在60s,之后过期,在下次访问该页面时,重新生成缓存。

比如,第一次访问时,生成缓存,然后60s内,不论谁访问该页面都有在使用反向代理缓存。过了60s,重新生成缓存。

第一次访问需要花费700ms,之后60s内访问就是50ms,的等待时间。

所有的访问都返回200

 

2.以下是使用了etag和last-modified

$articles = $query->getResult();

$etag = md5('202.82.0'.serialize($articles));

$response = new Response();

$response->setETag($etag);

//$response->setLastModified($article->getPublishedAt());

// mark the response as either public or private
$response->setPublic();
//$response->setPrivate();
// set the private or shared max age
//$response->setMaxAge(600);
$response->setSharedMaxAge(60);
// set a custom Cache-Control directive
$response->headers->addCacheControlDirective('must-revalidate' , true);

//make cache stale
//$response->expire();

//force response 304
//$response->setNotModified();

//set vary header
$response->setVary(array('Accept-Encoding' , 'User-Agent' ));

// Check that the Response is not modified for the given Request
if ($response->isNotModified($request)) {
    // return the 304 Response immediately
    return $response;
} else {
	 return $this->render('CmsCompanyBundle:Article:list.html.twig',array(
	  'page_title' => $page_title,
	  'catid' => $catid,
	  'articles' => $articles,
	  'navs' => $navs,
	  'paging' => $paging,
	  ),$response
	);
  
}

在启用了max-age的情况下,不管etag和文件是否被修改,都是要等到max-age过期之后,的访问,才会校验etag和last-modify,如果文件有变化,则会缓存一下。也就是说max-age比etag优先。在max-age过期之前的请求,web缓存会返回为修改或是未过期,使用了浏览器缓存,会返回304,强制刷新返回200,返回的是反向代理缓存。

在没有max-age的情况下,只要更新了文件,etag和last-modify 有了变化,就更新缓存。没有修改就返回304

。感觉加了etag和last-modify主要用于浏览器缓存。

减少了浏览器的重复请求。

比如文章修改了,或是新增了,生成反向代理缓存,需要时即时的,可以用etag和last-modify,不用max-age。如果是文章列表,访问频繁,且不需要添加一篇文章就立即展示在列表的,可以用max-age 加 etag和last-modify,减少web压力。

现在这些页面的缓存是通过访问页面生成的,需要访问页面预热反向代理缓存。

Leave a comment