Symfony2框架学习笔记之HTTP Cache用法详解(5)

在这种情况下,我们需要回复的特定URI缓存一个压缩版本和一个非压缩版本,基于请求的Accept-Encoding值返回它们。这是通过Vary Response头,Vary是一个不同头用逗号分隔,它的值触发请求资源的不同表示。

Vary:Accept-Encoding,User-Agent

注意,这个特别的Vary头,将基于URI和Accept-Encoding和User-Agent 请求头为每个资源的不同版本进行缓存。

Response对象提供一个干净的接口来管理Vary 头:

// 设置一个vary 头 $response->setVary('Accept-Encoding'); // 设置多个vary头 $response->setVary(array('Accept-Encoding', 'User-Agent'));

setVary()方法需要一个头名字或者一个头名字数组对应不同的response。

过期和校验:

你当然可以在同一个Response中同时使用校验和过期。因为过期胜过校验,你可以轻易的从它们两个中根据好处做出选择。换句话说,通过同时使用过期和校验,你可以指示缓存服务于缓存的内容,同时后台间隔检查来调查内容是否依然合法。

更多Response方法:

Response类提供了许多和缓存相关的方法。下面是主要的一些:

// 标志Response过期陈旧 $response->expire(); // 强迫response返回一个适合 304 的没有内容的response $response->setNotModified();

另外,跟缓存最相关的HTTP头可以被通过一个单独的方法setCache()设置。

// 通过一个调用设置缓存参数 $response->setCache(array( 'etag' => $etag, 'last_modified' => $date, 'max_age' => 10, 's_maxage' => 10, 'public' => true, // 'private' => true, ));

使用ESI(Edge Side Includes)

网关缓存是一个提高你网站执行效率的很好的途径。但是它们有一个限制:只能缓存整个页面。如果你不想缓存整个页面或者页面的某一部分很动态,你就没那么幸运了。

幸运的是,Symfony2为这些情况提供一个解决方案,基于ESI技术。它允许页面指定的部分和主页比起来有一个不同的缓存策略。

ESI规范描述标签你可以嵌入到你的页面来和网关缓存交流。Symfony2中只实现了一个标签,include, 因为这是唯一一个能在Akami上下文之外使用的标签。

<html> <body> Some content <!-- 嵌入一个其它页的内容 --> <esi:include src="https://..." /> More content </body> </html>

从这个例子中注意到每个ESI标签有一个全限定URL。一个ESI标签表示可以通过一个给定的URL获取的一个页面片段。

当请求被处理时,网关缓存从它的缓存或者从背后的应用程序中请求回复获取整个页面。换句话说,网关缓存既从缓存中获取包含的页面片段也会再次从背后的应用程序中获取回复请求的页面片段。当所有的ESI标签被解析后,网关缓存合并每一个ESI内容到一个主页并返回最后的内容到客户端。所有的这一切都透明的发生在网关缓存级(在你的程序外)。你将看到,如果你选择ESI标签,Symfony2让这包含它们的这一过程几乎不费劲。

在Symfony2中使用ESI

首先,使用ESI需要确认在你的应用程序配置中已经打开。

YAML格式:

# app/config/config.yml framework: # ... esi: { enabled: true }

XML格式:

<!-- app/config/config.xml --> <framework:config ...> <!-- ... --> <framework:esi enabled="true" /> </framework:config>

PHP代码格式:

// app/config/config.php $container->loadFromExtension('framework', array( // ... 'esi' => array('enabled' => true), ));

现在假设我们有一个页面时相对静态的,除了一个新闻自动收报机在内容的底部。使用ESI,我们可以缓存新闻自动收报机独立于页面其它部分。

public function indexAction() { $response = $this->render('MyBundle:MyController:index.html.twig'); $response->setSharedMaxAge(600); return $response; }

在该示例中,我们给全页面缓存周期为10分钟。接下来,通过嵌入一个action让新闻ticker包含到模板中。这是通过render帮助来实现的。因为嵌入的内容来自其它页面,Symfony2使用一个标准的render帮助来配置ESI标签:

Twig格式:

{% render '...:news' with {}, {'standalone': true} %}

PHP格式:

<?php echo $view['actions']->render('...:news', array(), array('standalone' => true)) ?>

通过把standalone设置为true,告诉Symfony2这个action应该被渲染为一个ESI标签。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/9e36e0e3dc3e6a07b60644dd0b7ea72d.html