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

你可能想知道为什么要使用一个helper方法来代替直接写ESI标签。这是因为使用helper让你的应用程序工作即使没有网关缓存被安装。让我们来看看它是怎样工作的。

当standalone为false时(也是默认值),Symfony2在发送response到客户端之前合并包含的页面内容到一个主页。

但是当standalone为true时,并且如果Symfony2发现它跟支持ESI的网关缓存对话时,它生成一个ESI include标签。

如果没有网关缓存或者网关缓存不支持ESI,Symfony2将只合并包含的标签页面内容到一个主要的像它在standalone为false时所做的一样。

嵌入的action现在可以指定自己的缓存规则了,完全独立于主页。

public function newsAction() { //... $response->setShareMaxAge(60); }

使用ESI,整个页面缓存将被保持600秒有效,但是新闻组建缓存将只持续60秒。

ESI的一个必备条件是嵌入的action可以通过一个URL被访问,这样网关缓存才可以独立于页面其它部分获取它。当然,一个action不能被通过一个URL访问除非有一个路由指向它。Symfony2 通过一个通用的路由和controller负责这个。

为了ESI包含标签能正常的工作,你必须定义_internal 路由:

YAML格式:

# app/config/routing.yml _internal: resource: "@FrameworkBundle/Resources/config/routing/internal.xml" prefix: /_internal

XML格式:

<!-- app/config/routing.xml --> <?xml version="1.0" encoding="UTF-8" ?> <routes xmlns="http://symfony.com/schema/routing" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routing "> <import resource="@FrameworkBundle/Resources/config/routing/internal.xml" prefix="/_internal" /> </routes>

PHP代码格式:

// app/config/routing.php use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Routing\Route; $collection->addCollection($loader->import('@FrameworkBundle/Resources/config/routing/internal.xml', '/_internal')); return $collection;

因为路由允许所有的action通过一个URL被访问,你可以通过使用Symfony2防火墙(允许访问你的反向代理的IP范围)内容保护它。

缓存策略的一大优势是你可以让你的应用程序根据动态的需要同时又尽量的减少触及应用程序。

一旦你开始使用ESI,请记住一定使用s-maxage指令代替max-age。因为浏览器只接受聚合的资源,它不知道子组件,所以它会按照max-age指令缓存整个页面。这是你不希望它做的。

render helper支持的两外两个有用选项:
alt:用作ESI标签的alt属性,当src找不到时,它允许你指定一个替代URL。
ignore_errors:如果设置为true,一个onerror属性将被添加到ESI,并且属性值设置为continue,在一个失败事件中,网关缓存将只默默的移除ESI标签。

缓存失效:

“计算机科学中有两大难题:缓存失效和命名事物”---Phil Karlton

你永远都不需要失效缓存数据,因为失效早已在HTTP缓存模型中被考虑到了。如果你使用校验,你永远都不需要通过定义校验任何事情;如果你使用过期并失效某个资源,它意味着你设置一个未来的过期日期。因为在任何类型的反向代理中失效都是一个顶级规范,如果你不担心失效,你可以在不改变任何应用程序代码的情况下在反向代理间切换。

其实,所有的反向代理都提供了清除缓存数据的方式,但是你需要尽量的避免使用它们。最标准的清除给定URL的缓存的方式是通过指定请求的HTTP方法为PURGE 来进行。

下面是如何配置Symfony2的反向代理支持PURGE HTTP方法:

// app/AppCache.php use Symfony\Bundle\FrameworkBundle\HttpCache\HttpCache; class AppCache extends HttpCache { protected function invalidate(Request $request) { if ('PURGE' !== $request->getMethod()) { return parent::invalidate($request); } $response = new Response(); if (!$this->getStore()->purge($request->getUri())) { $response->setStatusCode(404, 'Not purged'); } else { $response->setStatusCode(200, 'Purged'); } return $response; } }

注意,你必须保护你的PURGE HTTP方法以避免随便一个人使用某些方法清除你的缓存数据。

总结:

Symfony2旨在遵循一条被证明了的道路规则:HTTP。 缓存也不例外。掌握Symfony2缓存系统意味着熟悉HTTP缓存模式和有效的使用它们。

这就意味着,你不能只依赖于symfony2文档和代码示例,你必须了解有关HTTP缓存和网关缓存的更宽阔的知识,比如Varnish。

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

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