我尝试使用私有/公共缓存,以避免检索用于构建主页内容的所有数据。这是安静的静态内容。
我试着这样做。
$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
答案 0 :(得分:4)
使用HTTP缓存时,您需要将应用程序视为一个整体。
根据您的反向代理,默认策略是根据其URI缓存页面。 ETag用于发出条件请求以避免从后端获取实际数据,但它不会改变缓存策略的行为。
因此,使用您当前的设置,每次用户访问时,让我们说example.net/fr
,在定义的2000秒内,它将获得从您的后端检索到的第一个缓存内容,无论货币如何他选择了。
如果要优化性能,则需要减少以删除不太常见的信息。
在您的情况下,您可能希望至少缓存2个内容的表示形式:
等等。
为什么呢?因为您不想缓存所有可能的表示,否则您的缓存将变得无用。
要使您的缓存策略高效,您需要能够为最多人缓存数据,因此如果您有一些像“欢迎{username}”这样的块,它将失败,因为您可能需要缓存为每个用户表示您的内容,这是错误的。
保留某种“欢迎{username}”块的最佳方法是使用ESI,它允许您将布局分成几个块,每个块都有不同的缓存策略(或根本没有缓存)。
你的问题是我打赌货币存储在某种cookie中。默认情况下,大多数反向代理(如清漆)不会使用cookie缓存响应,因为它可能是一个主要的安全漏洞。
因此,您基本上有两个解决方案,定义您的自定义策略,使用Varnish或使用HTTP功能(自定义标头+ Vary)非常简单。