我在我的 Symfony 3 应用程序中启用了 ESI,我有这个app_dev.php
:
$kernel = new AppKernel('dev', true);
$kernel = new AppCache($kernel);
现在我有config.yml
:
framework:
esi: { enabled: true }
fragments: { path: /_fragment }
在我的控制器中:
/**
* @Route("/foo/bar/{fooId}", name="AppBundle_Foo_bar")
*/
public function barAction(int $fooId, Request $request)
{
//some database querying from repositroy
$response = $this->render('AppBundle:Foo:bar.html.twig',['foo' => $foo]);
$response->setETag(md5($response->getContent()));
$response->setPublic();
$response->isNotModified($request);
return $response;
}
bar.html.twig
这是我要缓存的视图 ( ),如下所示:
{{foo}}
现在,我有另一种呈现主视图的方法。
/**
* @Route("/baz/{fooId}", name="AppBundle_Foo_baz")
* @Template
*/
public function bazAction(int $fooId)
{
return [
'fooId' => $fooId
];
}
我的baz.html.twig
样子:
{% extends 'AppBundle::layout.html.twig' %}
{% block content %}
{{ render_esi(controller('AppBundle:Foo:bar', { 'fooId': fooId })) }}
{% endblock content %}
所以我想主要有非缓存视图(baz)并嵌套barAction()
在其中并缓存它。
但是,我得到了:
Cache-Control:must-revalidate, no-cache, private
即使我明确将其设置为公开,我也得到:
X-Symfony-Cache:GET /baz/1: miss;
每次我刷新页面时,我都会得到:
GET /_fragment?_hash=aO.....Details: stale, invalid, store
如果我刷新无效变为有效。但我无法设置缓存。
编辑:
我阅读了有关 ESI 和验证缓存的信息,似乎它们不能一起工作。所以我尝试了验证缓存并添加了
$response->setSharedMaxAge(15);
$response->headers->addCacheControlDirective('must-revalidate', true);
而不是 ETag。结果还是一样...