16. Yii 2.0 http缓存
2016-09-04 11:45
225 查看
Yii 2.0 的 http缓存是基于http协议的,只对 GET 请求生效。
应用场景:如果我们的web服务器采用动静分离的技术,即客户端的页面请求只请求html页面框架(静态数据),而客户端的数据请求(动态数据)通过Ajax请求来实现,那么我们就可以将静态数据利用http缓存来实现。
http缓存的原理:
如果开启了http缓存,客户端浏览器请求服务器时,会给服务器发送一个 If-Modified-Since(时间戳,包含在请求消息头中),服务器会将该时间戳与自身的 lastModified(也是一个时间戳)的值进行比较:
如果二者的值一致,服务器就会直接给浏览器响应一个状态行(304 Not Modified),告诉浏览器请求的页面没有变化,这样浏览器就会从自身的缓存中取出页面呈现给用户;
如果二者的值不一致,服务器就会给浏览器响应一个 lastModified(时间戳,包含在响应消息头中),同时把最新的页面响应给客户端浏览器,浏览器再把这个页面呈现给用户。
当然,我们也可以用 etagSeed 代替 lastModified,原理类似,但 etagSeed 操作起来更加灵活,它也适合于非动静分离的场景。
http缓存利用的是客户端浏览器的缓存,故不需要服务器端缓存介质的支持。
这里以 Yii 2.0 高级版为例,介绍http缓存。
操作http缓存的类文件为 /advanced/vendor/yiisoft/yii2/filters/HttpCache.php
首先,修改前台的变量配置文件 /advanced/frontend/config/params.php,配置一个 lastModified 变量,代码如下:
其次,在前台控制器层 /advanced/frontend/controllers 中,添加一个控制器 HttpController.php,代码如下:
最后,在浏览器中输入 http://yii.frontend.com/?r=http/index,并打开web控制台调试工具,查看效果。
应用场景:如果我们的web服务器采用动静分离的技术,即客户端的页面请求只请求html页面框架(静态数据),而客户端的数据请求(动态数据)通过Ajax请求来实现,那么我们就可以将静态数据利用http缓存来实现。
http缓存的原理:
如果开启了http缓存,客户端浏览器请求服务器时,会给服务器发送一个 If-Modified-Since(时间戳,包含在请求消息头中),服务器会将该时间戳与自身的 lastModified(也是一个时间戳)的值进行比较:
如果二者的值一致,服务器就会直接给浏览器响应一个状态行(304 Not Modified),告诉浏览器请求的页面没有变化,这样浏览器就会从自身的缓存中取出页面呈现给用户;
如果二者的值不一致,服务器就会给浏览器响应一个 lastModified(时间戳,包含在响应消息头中),同时把最新的页面响应给客户端浏览器,浏览器再把这个页面呈现给用户。
当然,我们也可以用 etagSeed 代替 lastModified,原理类似,但 etagSeed 操作起来更加灵活,它也适合于非动静分离的场景。
http缓存利用的是客户端浏览器的缓存,故不需要服务器端缓存介质的支持。
这里以 Yii 2.0 高级版为例,介绍http缓存。
操作http缓存的类文件为 /advanced/vendor/yiisoft/yii2/filters/HttpCache.php
首先,修改前台的变量配置文件 /advanced/frontend/config/params.php,配置一个 lastModified 变量,代码如下:
<?php return [ 'adminEmail' => 'admin@example.com', 'lastModified' => 1472287640, // 设置自定义变量,用于控制http缓存 ];
其次,在前台控制器层 /advanced/frontend/controllers 中,添加一个控制器 HttpController.php,代码如下:
<?php namespace frontend\controllers; use yii\web\Controller; class HttpController extends Controller { /* * 使用http缓存的控制器中,必须包含该方法 */ public function behaviors() { // http缓存配置 return [ [ 'class' => 'yii\filters\HttpCache', 'only' => ['index'], // 指定http缓存对哪些action生效 'lastModified' => function ($action, $params) { // $q = new \yii\db\Query(); // return $q->from('user')->max('updated_at'); // return 1472287616; return \Yii::$app->params['lastModified']; }, // 如果采用etagSeed来识别http缓存页面是否变化,就不要用 lastModified, etagSeed操作起来更为灵活,且也适用于非动静分离的场景 // 'etagSeed' => function ($action, $params) { // return // generate ETag seed here // return (string)($q->from('user')->max('id')); // } ], ]; } /** * http缓存测试 */ public function actionIndex(){ echo time().' '; echo \Yii::$app->params['lastModified']; } }
最后,在浏览器中输入 http://yii.frontend.com/?r=http/index,并打开web控制台调试工具,查看效果。
相关文章推荐
- 16. Yii 2.0 http缓存
- yii2.0的http缓存
- HTTP 缓存介绍
- xmlHttpRequest避免缓存的办法
- HTTP学习(二) HTTP连接、代理、缓存
- .Net 2.0 缓存使用
- [原创]java WEB学习笔记45:自定义HttpFilter类,理解多个Filter 代码的执行顺序,Filterdemo:禁用浏览器缓存的Filter,字符编码的Filter,检查用户是否登陆过的Filter
- ASIHttpRequest 本地缓存
- HTTP 缓存
- HTTP协议--缓存 (四)
- 彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
- 彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
- HTTP协议:缓存
- ASP.NET 2.0 中改进的缓存功能
- HTTP详解2-请求、响应、缓存
- Enterprise Library 2.0 Hands On Lab 翻译(9):缓存应用程序块(一)
- HTTP消息头网页缓存控制以及header常用指令(转)
- 发布全部开源的Asp.net 2.0 RBAC 权限管理系统了,大家支持下。测试版发布: http://Wenzy.37live.com
- ASP.NET 2.0中的页面输出缓存
- ASP.NET 2.0中的页面输出缓存