加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

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

发布时间:2020-05-23 15:30:04 所属栏目:PHP 来源:互联网
导读:这篇文章主要介绍了Symfony2框架HTTP Cache用法,结合实例形式分析了Symfony框架HTTP缓存的相关使用技巧,需要的朋友可以参考下

本文实例讲述了Symfony2框架HTTP Cache用法。分享给大家供大家参考,具体如下:

富web应用程序的本质意味着它们的动态。无论你的应用程序多么有效率,每个请求比起静态文件来说总会存在很多的耗费。对于大多数web程序来说,这没什么。 Symfony2非常的轻快,无论你做些严重超载的请求,每个请求将会得到很快的回复,而不会对你的服务器造成压力。但是随着你站点的成长,负载将成为一个严重的问题。对每个请求处理应该只被正常执行一次。这就是缓存真正要达成的目标。

站在巨人肩膀上的缓存:

提高一个应用程序执行效率的最有效方法是缓存一个页面的所有输出然后让后续的请求绕开整个应用程序。当然,这对于高动态性的站点来说并不是总是可能的。Symfony2 缓存系统是比较特别的,因为它依赖于在HTTP规范中定义的简单强大的HTTP cache。没有重新发明新的缓存方法,Symfony2 拥抱在web上定义基础交流的标准。一旦你理解了基础的HTTP校验和过期缓存模式,你就会完全掌握了Symfony2的缓存系统。

第一步:一个网关缓存(gateway cache),或者反向代理。是一个坐在你应用程序前面的对立的层。反向代理缓存来自于你应用程序的响应并使用这些缓存响应在某些请求到达你应用程序之前来回复它们。 Symfony2提供了自己的反向代理,也可以使用其它任何的反向代理。

第二步:HTTP缓存 (HTTP cache)头用于和网关缓存以及任何其位于客户和你的应用程序之间的其它缓存交流。Symfony2 提供了和缓存头交互的预设行为和强大接口。

第三步:HTTP 超时和校验时用于决定一个缓存内容是否新鲜和陈旧的两种模式。

第四步:ESI(Edge Side Includes)允许HTTP缓存被用于独立缓存页面片段(甚至是嵌套片段)。使用ESI,你甚至可以缓存一个完整的页面60分钟。但一个嵌入式边栏缓存只有5分钟。

使用网关缓存

当使用HTTP缓存时,缓存是跟你的应用程序完全分离的,它位于你的请求客户端和应用程序之间。该缓存的工作就是从客户端接收请求并把它们传递回你的应用程序。同时它也将接收从你的应用程序返回的响应并把它转给客户端。可以说它是你的应用程序和请求客户端之间请求-响应交互的中间人。

按照这个思路,缓存会保存被认为是“可缓存的”每一个响应回复。当同样的请求再次传来时,该缓存会把自己缓存的响应直接回复给请求客户端,而完全忽略你的应用程序。这种类型的缓存就是HTTP网关缓存。目前有很多这类缓存,比如Varnish,Squid in reverse proxy mode和Symfony2 反向代理等。

缓存类型

一个网关缓存不是缓存的唯一类型。事实上,有三种不同类型的缓存会截获并使用你的应用程序发出的HTTP缓存头。它们是:

浏览器缓存(Browser caches):浏览器拥有自己的本地缓存,这对你单击"前一步"或者查看图片和其它网络资产时起到了主要作用。

代理缓存(Proxy caches):一个代理缓存是一个多人位于一人之后的共享的缓存。它们大多是一些大公司或者ISP安装用来减少延迟和网络阻塞的。

网关缓存(Gateway caches):像一个代理,也是一个共享缓存但是是位于服务器端的。一般是网络管理员安装它们,它使得网站更具可伸缩性,可靠性和高效性。网关缓存有时候被称为反向代理缓存,代理缓存,更或者是HTTP加速器。

Symfony2 反向代理

Symfony2拥有一个用PHP编写的反向代理(也叫做网关缓存)。开启它后,来自你应用程序的可缓存的响应回复将会开始被立刻缓存。安装它相也当容易。每一个新的Symfony2应用程序都有一个预配置缓存内核(AppCache)包含了一个默认的AppKernel。该缓存内核就是个反向代理。要开启缓存,修改前端控制器代码使用缓存内核:

loadClassCache(); //使用AppCache包裹默认的AppKernel $kernel = new AppCache($kernel); $kernel->handle(Request::createFromGlobale())->send();

缓存内核会立刻扮演一个反向代理的角色,缓存来自你应用程序的回复把它们发回给请求客户端。

注意,该缓存内核有一个特别的getLog()方法返回一个能够表示在缓存层发生了什么的字符串。

可以在开发环境中来调试和校验你的缓存策略。

getLog());

AppCache 对象是一个合理的默认配置,当然你也可以通过重写getOptions()方法来设置可选项对它进行调优。

false,'default_ttl' => 0,'private_headers' => array('Authorization','Cookie'),'allow_reload' => false,'allow_revalidate' => false,'stale_while_revalidate' => 2,'stale_if_error' => 60,); } }

注意,这里无论怎么重写getOptions()方法,其中debug选项将被包裹的AppKernel的debug值自动设置。

default_ttl: 当没有显式的刷新信息在回复中提供时,一个缓冲实体应该被认为是新鲜的时间秒数。显式的设置Cache-Control 或者 Expires 头会覆盖这个参数值。默认值为0。 private_headers:请求头组,它在回复上触发"private" Cache-Control 行为,无论回复是通过Cache-Control 指令显式的声明是public还是private 。默认为Authorization和Cookie。 allow_reload: 指定是否允许客户端通过在请求中指定Cache-Control的"no-cache"指令来强迫缓存重新加载。设置它为true时符合RFC2616规范。默认值为false。 allow_revalidate:指定是否允许客户端通过在请求中指定Cache-Control的"max-age=0"指令来强迫缓存重新校验。设置它为true时符合RFC2616规范。默认值为false。 stale_while_revalidate:用于指定一个默认秒数(间隔是秒因为回复TTL精度是1秒),在期间缓存还在后台进行重新校验时可以立刻返回一个陈旧的回复(默认是2);该设置会被stale-while-revalidate HTTP Cache-Control扩展重写(RFC 5861)。 stale_if_error: 指定一个默认秒数(间隔是秒)在这期间缓存可以提供一个陈旧的回复当遇到一个错误时。默认值为60。该设置会被stale-if-error HTTP Cache-Contorl 扩展重写(RFC5861)

如果debug设置为true,Symfony2 会自动添加一个X-Symfony-Cache 头到回复保存着关于缓存点击和丢失的信息。

从一个反向代理到另一个的转换:

Symfony2反向代理是一个在开发你的站点或者部署你的站点到一个共享主机而你无法安装任何除PHP代码以外的东西时的非常有用的工具。但是因为使用PHP编写,它不能跟用C写成的反向代理那样快速。这就是为什么我们推荐使用Varnish或者Squid到你的运营服务器上的原因。好消息是从一个代理服务器到另外一个替换很容易,简单的不用你修改任何程序代码。你可以开始时使用Symfony2的反向代理等到了阻塞增加时升级到Varnish。

注意:Symfony2 反向代理执行效率独立于应用程序的复杂性。因为应用程序核心仅仅在请求需要被转发到它时才被启动。

HTTP缓存说明:

为了发挥可用缓存层的优势,你的应用程序必须能传达它的哪个回复可以被缓存,什么时候/怎样 缓存会变成陈旧的规则。这些是通过在回复(response)上设置HTTP 缓存头来实现的。

记住,"HTTP"只不过是一种web客户端和服务器之间交流的简单文本语言。当我们说HTTP 缓存时,我们说的是它允许客户端和服务器交换信息相关的缓存。

HTTP指定了4个Response缓存头,我们需要关注一下:

其中最重要的也是万能的头是Cache-Control头,它其实是一个各种缓存信息的集合。

Cache-Control Header

Cache-Control头是唯一的一个其内部包含了各种各样的关于一个response是否可以被缓存的信息。每条信息之间用逗号隔开。

Symfony 提供一个Cache-Control头的抽象,使它的创建更加可控。

setPublic(); $response->setPrivate(); // 设置private或者shared 的最大年龄 age $response->setMaxAge(600); $response->setSharedMaxAge(600); // 设置一个自定义的Cache-Control 指令 $response->headers->addCacheControlDirective('must-revalidate',true);

公共vs私有 Response

网关缓存和代理缓存都被认为是“共享”缓存,因为它们缓存的内容是被多用户共享的。如果一个特定用户的回复曾被错误的存储到共享缓存中,它以后可能被返回给无数的不用用户。想象一下,如果你的账户信息被缓存然后返回给每一个后来请求他们自己账户页面的用户。要处理这种情况,每个回复可能都要设置时public还是private。

public 说明给回复可能被private和共享的缓存保存。 private 说明所有的或者部分的回复信息时给一个单独用户的,所以不能缓存到共享缓存中。

Symfony 谨慎地默认每个回复为private。 要使用共享缓存的优点(比如Symfony2反向代理),回复必须被显式的设置为public。

安全方法:

HTTP缓存仅仅为安全方法工作(比如GET和HEAD)。要安全意味着当它为某个请求服务时从来不会改变服务器上应用程序的状态。(当然你可以写日志信息,缓存数据等)。这里有两个很合理的后果(consequences):

当你的应用程序回复一个GET或者HEAD请求时,你绝对不会改变你应用程序的状态。即使你不用网关缓存,代理缓存的存在意味着任何GET和HEAD请求可能会或者可能不会真的达到你的服务器。

不要期望PUT,POST或者DELETE方法被缓存。这些方法被使用意味着你应用程序状态的改变。缓存它们将阻止某种请求访问或者改变你的应用程序。

缓存规则和默认设置

HTTP 1.1 默认情况下允许缓存任何事情除非有一个显式的Cache-Control头。实践中,大多数缓存当请求有cookie,一个授权头,使用一个非安全的方法(比如PUT,POST,DELETE)或者当请求有一个重定向代码时,不会进行任何缓存活动。

当开发者没有做任何设置时,Symfony2 会自动按照下面的规则设置一个合理的比较保守的Cache-Control头:

如果没有缓存头被定义(Cache-Control,Expires,ETag 或者Last-Modified),Cache-Control被设置为no-cache,意味着该response将不会被缓存。

如果Cache-Control 为空(但是有另一个缓存头存在),它的值被设置为private,must-revalidate;

如果至少一个Cache-Control指令被设置,并且没有'public'或者‘private'指令被显式的添加,Symfony2 会自动添加一个private指令(除去s-maxage 被设置的情况)。

HTTP过期和校验

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读