使用symfony2 http缓存的动态头的缓存策略

时间:2013-10-13 14:36:10

标签: symfony http-caching

我尝试使用私有/公共缓存,以避免检索用于构建主页内容的所有数据。这是安静的静态内容。

我试着这样做。

    $response->setMaxAge(600);
    // mark the response as either public or private
    $response->setPublic();
    $response->setPrivate();

    // set the private or shared max age
    $response->setMaxAge(2000);
    $response->setSharedMaxAge(2000);
    $response->setETag(md5($response->getContent()));
    $response->isNotModified($this->getRequest());
    // set a custom Cache-Control directive
    $response->headers->addCacheControlDirective('must-revalidate', true);

但是,我有一些可以像语言和货币选择一样动态变化的小信息。

如果用户决定更改语言或货币,如何更改内容?

它目前正在使用语言,因为URL与home.site/fr或home.site/en不同。

但是货币的信息不在网址中,其他信息如authentified或not也不在网址中。

那么如何使用Http缓存并保持用户操作的真实性呢?

感谢您的帮助。

号Yoni

1 个答案:

答案 0 :(得分:4)

使用HTTP缓存时,您需要将应用程序视为一个整体。

根据您的反向代理,默认策略是根据其URI缓存页面。 ETag用于发出条件请求以避免从后端获取实际数据,但它不会改变缓存策略的行为。

因此,使用您当前的设置,每次用户访问时,让我们说example.net/fr,在定义的2000秒内,它将获得从您的后端检索到的第一个缓存内容,无论货币如何他选择了。

如果要优化性能,则需要减少以删除不太常见的信息。

在您的情况下,您可能希望至少缓存2个内容的表示形式:

  1. FR + EUR
  2. EN + EUR
  3. 等等。

    为什么呢?因为您不想缓存所有可能的表示,否则您的缓存将变得无用。

    要使您的缓存策略高效,您需要能够为最多人缓存数据,因此如果您有一些像“欢迎{username}”这样的块,它将失败,因为您可能需要缓存为每个用户表示您的内容,这是错误的。

    保留某种“欢迎{username}”块的最佳方法是使用ESI,它允许您将布局分成几个块,每个块都有不同的缓存策略(或根本没有缓存)。

    你的问题是我打赌货币存储在某种cookie中。默认情况下,大多数反向代理(如清漆)不会使用cookie缓存响应,因为它可能是一个主要的安全漏洞。

    因此,您基本上有两个解决方案,定义您的自定义策略,使用Varnish或使用HTTP功能(自定义标头+ Vary)非常简单。