Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用symfony2 http缓存的dynamics标头缓存策略_Symfony_Http Caching - Fatal编程技术网

使用symfony2 http缓存的dynamics标头缓存策略

使用symfony2 http缓存的dynamics标头缓存策略,symfony,http-caching,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 $resp

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

我试着这样做

    $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不同

但是货币信息不在url中,其他信息如authentified或not也不在url中

那么,如何使用Http缓存并使其符合用户操作的实际情况呢

谢谢你的帮助


Yoni

使用HTTP缓存时,您必须将应用程序作为一个整体考虑

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

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

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

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

  • 法国法郎+欧元
  • 欧洲+欧元
  • 等等

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

    为了提高缓存策略的效率,您需要能够为最多人缓存数据,因此如果您有“Welcome{username}”之类的块,它将失败,因为您可能必须为每个用户缓存内容的表示,这是错误的

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

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


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

    在使用HTTP缓存时,您必须将应用程序作为一个整体来考虑

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

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

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

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

  • 法国法郎+欧元
  • 欧洲+欧元
  • 等等

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

    为了提高缓存策略的效率,您需要能够为最多人缓存数据,因此如果您有“Welcome{username}”之类的块,它将失败,因为您可能必须为每个用户缓存内容的表示,这是错误的

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

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

    因此,您基本上有两种解决方案,定义您的自定义策略,使用Varnish或使用HTTP功能(自定义头+变量)时非常容易