我正在一个 symfony2 网站上工作,我需要缓存几个页面,但有些部分必须保持未缓存(如用户菜单等)。我检查了文档,ESI 似乎正是为此而构建的。
我开始在我的项目中为我的博客文章页面实现缓存。我按照 Symfony2 文档中的建议使用 last modified 和 Etag 设置缓存验证。
我所有页面的标题中都有一个用户菜单。它使用 ESI 渲染,我确保它不会缓存。据我所见,它不起作用。我的整个博客文章页面每次都被完全缓存,连同用户菜单。它保存在浏览器缓存中,并且仅在我实际更新博客文章时才更新(这是正确的)。
这是我的博客文章控制器代码:
public function showAction($slug)
{
$response = new Response();
$response->setETag(md5($response->getContent()));
$date = $article->getModifiedAt();
$response->setLastModified($date);
$response->setPublic();
$response->headers->addCacheControlDirective('must-revalidate', true);
// Check that the Response is not modified for the given Request
if ($response->isNotModified($this->getRequest())) {
// return the 304 Response immediately
return $response;
} else {
//do stuff
return $this->render('NewsBundle:News:show.html.twig', array(
'article' => $article,
),$response);
}
我的用户菜单控制器:
public function userMenuAction()
{
$response = new Response();
$response->setSharedMaxAge(0);
return $this->render('MainBundle:Views:userMenu.html.twig', array(
'user' => $user,
),$response);
}
我的 ESI 路由
ESI_userMenu:
pattern: user-menu
defaults: { _locale: en, _controller: MainBundle:Default:userMenu }
ESI 渲染:
{% render url('ESI_userMenu') with {}, {'standalone': true} %}
当我加载我的博客文章页面时,我注意到用户菜单也被缓存了。我进行了更多测试,发现如果我不使用“isNotModified”,而是设置一个过期时间,ESI 确实可以工作。
有什么方法可以让 ESI 使用我在博客文章中使用的“isNotModified”结构?
谢谢
编辑:
ESI 似乎不适用于验证缓存...