0

我正在一个 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 似乎不适用于验证缓存...

请参阅此处: 使用 Symfony2 为什么会忽略缓存响应中的 ESI 标记?

4

1 回答 1

2

ESI 似乎不适用于验证缓存,但只能用于过期缓存。注意我是在2.0.23中测试的,也许以后的版本解决了这个问题。

为什么使用 Symfony2 缓存响应中的 ESI 标签会被忽略?

于 2013-05-31T09:23:55.953 回答