2013-10-13 102 views
0

我试图使用私人/公共缓存,以避免检索所有用于构建主页内容的数据。这是安静的静态内容。使用symfony2 http动态缓存动态头缓存策略

我试着这样做。

$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。

但货币的信息不在网址中,而其他信息如验证与否也不在网址中。

那么如何使用Http缓存并使事情真正符合用户操作?

感谢您的帮助。

号Yoni

回答

4

使用您有想你的应用程序作为一个整体HTTP缓存。

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

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

如果你想优化你的表现,你需要减少删除不太常见的信息。

在你的情况,你可能会想你的缓存内容的至少2表示:

  1. FR + EUR
  2. EN + EUR

等等。

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

为了使缓存策略更有效率,您需要能够为最多的人缓存数据,因此如果您拥有“欢迎{username}”等块,它将会失败,因为您可能必须缓存每个用户的内容表示,这是错误的。

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

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

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