入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

15. Yii 2.0 页面缓存

创建时间:2016-09-03 投稿人: 浏览次数:1232
页面缓存是将整个静态页面(一般是首页)进行缓存,也比较常用,一般采用 File 作为缓存介质。 页面缓存是将整个控制器方法的输出(整个页面),利用缓存介质缓存起来,页面缓存生效期间,改变指定方法(一般是缓存index方法)的输出,实际的输出并不会发生变化。

这里以 Yii 2.0 高级版为例,介绍页面缓存。
操作页面缓存的类文件为 /advanced/vendor/yiisoft/yii2/filters/PageCache.php
首先,修改组件配置文件 /advanced/common/config/main.php,注册一个不同的缓存组件 fcache,内容如下:
<?php
return [
    "vendorPath" => dirname(dirname(__DIR__)) . "/vendor",
    "components" => [
        "cache" => [
            "class"     => "yiicachingMemCache",  // memcache缓存介质,常用于数据缓存
            "keyPrefix"    => "advanced_",    // key 的前缀
            "servers"    => [    // 可配多个memcache服务器,分布式
                [
                    "host"    => "127.0.0.1",
                    "port"    => 11211,
                    "weight"=> 100,  //权重,即访问该memcache服务器的概率
                ],
            ],
        ],

        "fcache" => [  // 注册一个不同的组件名称 fcache,用于和 cache 组件区分开来
            "class"     => "yiicachingFileCache", // 文件缓存介质,常用于页面缓存
        ]
    ],    

];
其次,我们在前台控制器层 /advanced/frontend/controllers 新建一个文件 PageCacheController.php 用于测试,内容如下:
<?php
namespace frontendcontrollers;

use yiiwebController;
use frontendmodelsUser;

class PageCacheController extends Controller {

    /*
     * 控制器中必须包含该方法,来实现页面缓存
     */
    public function behaviors()
    {
         return [
              // 页面缓存的配置
             "pageCache" => [
                 "class" => "yiifiltersPageCache",
                 "only" => ["index"], // 指定对哪个方法采用页面缓存,可配置多个
                 "duration" => 60,    // 过期时间
                 "dependency" => [    // 缓存依赖,控制缓存失效的另外一种辅助方法
                     "class" => "yiicachingDbDependency",
                     "sql" => "SELECT COUNT(*) FROM basic_user",
                 ],
                 "variations" => [  // 根据语言的不同,生成多个缓存
                     Yii::$app->language,
                 ],

                 "cache"    => "fcache",    // 页面缓存的缓存介质,指定使用文件缓存组件,默认值为 cache
                 "enabled"    => !YII_DEBUG,  // 是否启用页面缓存,一般debug模式下,我们会设置关闭页面缓存,部署到生产环境时,关闭了调试模式,就会使用页面缓存
             ],
         ];
    }

    /**
     * index方法,采用页面缓存(用文件缓存介质,当然页面缓存也可以使用memcache缓存介质,但一般不这么使用)
     * 本页面采用了页面缓存,就没有必要再使用数据缓存
     */
    public function actionIndex(){    
        echo "页面缓存:".microtime(true)."
"; } /** * 其他方法,采用数据缓存(一般用memcache作为缓存介质) */ public function actionDataCache(){ $key = "userlist"; $start = microtime(true); // Yii::$app->cache->delete($key); // 如果user表有写操作,就删除缓存,以便更新缓存 $userList = Yii::$app->cache->get($key); // 读取缓存 if ($userList===false) { // 如果缓存不存在 echo "从数据库中读取数据!"."
"; $userList = (new User())->getList(); // 从数据库中查询数据 $end = microtime(true); Yii::$app->cache->set($key, $userList, 60); // 写入缓存,过期时间为10秒,0表示永不过期 } else { echo "从缓存中读取数据!"."
"; $end = microtime(true); } echo $end-$start."
"; // 查看读取数据所有的时间 var_dump($userList); } }
由于是测试,故就算是debug模式,我们也可以开启页面缓存,将  "enabled"    => !YII_DEBUG 中的感叹号去掉即可。
最后,在浏览器中输入 http://yii.frontend.com/?r=page-cache/index 测试页面缓存,输入 http://yii.frontend.com/?r=page-cache/data-cache 可测试数据缓存。
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。