我试图使用私有/公共缓存,以避免检索用于构建主页内容的所有数据。这是安静的静态内容。
我试着那样做。
$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);但是,我有一些小的信息,可以真正动态地改变,比如语言,cy选择。
如果用户决定改变语言或货币,如何改变内容?
它目前正在为语言工作,因为URL是不同的then .then/fr或then.then/en。
但是,货币的信息不在网址中,其他的信息,如认证或未认证,也不在网址中。
那么,如何使用Http缓存并使其与用户操作的真实情况相适应呢?
谢谢你的帮助。
尤尼
发布于 2013-10-14 18:38:05
在使用HTTP缓存时,您必须将应用程序视为一个整体。
根据反向代理的不同,默认策略是根据页的URI缓存页面.ETag用于发出条件请求,以避免从后端获取实际数据,但它不会改变缓存策略的行为。
因此,使用当前的设置,每次用户访问,比方说example.net/fr,在定义的2000秒内,它将获得从后端检索到的第一个缓存内容,而不管他选择何种货币。
如果要优化性能,则需要减少以删除较不常见的信息。
在您的示例中,您可能希望缓存至少2种内容的表示:
所以。
为什么?因为您不想缓存所有可能的表示,否则您的缓存将变得无用。
为了提高缓存策略的效率,您需要能够最大限度地缓存数据,所以如果您有“欢迎{用户名}”这样的块,它将失败,因为您可能必须为每个用户缓存您的内容的表示,这是错误的。
保持某种类型的“欢迎{用户名}”块的最佳方法是使用ESI,它允许您使用不同的缓存策略(或者根本没有缓存)将布局分割到几个块中。
在你的情况下,问题是,我打赌货币是存储在某种曲奇。默认情况下,大多数反向代理(如清漆)不使用cookie缓存响应,因为它可能是一个主要的安全漏洞。
因此,您基本上有两个解决方案,定义您的自定义策略,在使用Varnish或使用HTTP功能(自定义标头+变量)时非常容易。
https://stackoverflow.com/questions/19346379
复制相似问题