当前位置:  开发笔记 > 编程语言 > 正文

Symfony中的ESI缓存3

如何解决《Symfony中的ESI缓存3》经验,为你挑选了0个好方法。

我在我的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我要缓存的view(),如下所示:

{{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.并且结果仍然相同......

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有