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

yii缓存使用

创建时间:2017-09-23 投稿人: 浏览次数:273

        //缓存
        $cache = Yii::$app->cache;

        // 缓存api
//        get : 返回缓存数据,如果缓存失效或不存在返回false
//        set : 设置一个缓存
//        add : 如果缓存中未找到该键,则将制定数据放到缓存中
//        multiGet:通过指定多个键,从缓存中取出多项数据
//        multiSet:将多项数据存储到缓存中,每项数据对应一个key
//        multiAdd:将多项数据存储到缓存中,每项数据对应一个key
//        exists:某个缓存是否存在
//        delete:删除某个缓存
//        flush:删除缓存中所有数据



        //1 数据缓存
        $data = Yii::$app->cache->get("postCount");
        //缓存依赖: 如果count(id)数量变化了,即使没有到过期时间也会更新缓存
        /**
         * 缓存依赖类
        DbDependency : 如果指定的sql语句结果发生变化,则依赖改变将重新缓存
        FileDependency:如果文件最后修改时间发生变化,,则依赖改变将重新缓存
        ChainedDependency:如果依赖链上任何一个依赖发生变化,则依赖改变将重新缓存
        ExpressionDependency:如果指定php表达式结果发生变化,,则依赖改变将重新缓存
        GroupDependency:将一项缓存数据标记到组名,你可以通过调用对象的invalidate()一次性将相同u组名的缓存全部设置为失效状态
         */

        $dependency = new yiicachingDbDependency(["sql"=>"select count(id) from test"]);
        if($data === false){
            $data = Test::find()->count();
            Yii::$app->cache->set("testCount",$data,600,$dependency);
        }


        //2 片段缓存(可以嵌套使用)
        $dependency = new DbDependency(["sql"=>"select count(id) from test"]);
        if($this->beginCache("cacheKey",["duration"=>600],["dependency"=>$dependency])){
            echo TagsCloudWidget::widget(["tags"=>$tags]);
            $this->endCache();
        }
        //片段缓存中有少许动态内容变化,可以调用如下方法插入:
        $this->renderDyamic("return Yii::$app->user->identity->name;");


        //3 页面缓存
        //页面缓存类要放在behaviors中
        public function behaviors()
        {
            return [
                "pageCache" => [
                    "class"=>"yiifiltersPageCache",
                    "only"=>["index"], //指定要缓存的页面(渲染该页面的action,actionIndex)
                    "duration"=>600, //过期秒数
                    "variations"=>[ //让缓存跟随参数变化(比如我缓存一个列表,如果不设置跟随页数变化缓存,那我点第几页都显示第1页缓存,他不会根据参数变化)
                        Yii::$app->request->get("page"),  //设置index列表根据参数页码变化,这样每个页面都有自己的缓存,不会出现每个页都显示第一页的缓存
                        Yii::$app->request->get("searchKey") //搜索字段使用不同缓存
                    ],
                    "dependency"=>[ //依赖
                        "class"=>"yiicachingDbDependency",
                        "sql"=>"select count(id) from test"
                    ]
                ],
            ];
        }


        //4 http缓存
        //http缓存与页面缓存同样配置在behaviors中
        public function behaviors()
        {
            return [
                "httpCache" => [
                    "class"=>"yiifiltersHttpCache",
                    "only"=>["detail"], //指定要缓存的页面(渲染该页面的action,actionIndex)

                    //可以设置三种http的header:lastModified,etagSeed,cacheControlHeader
                    "lastModified"=>function($action,$params){ //对应http头的Last-Modified,会给http头设置一个时间,如果这个时间修改了就重新请求
                        $q = new yiidbQuery();
                        return $q->from("test")->max("update_time");
                    },
                    "etagSeed"=>function($action,$param){ //对应http头的Etag,会给http头设置一个hash值,如果这个hash值修改了就重新请求
                        $test = Test::findOne(Yii::$app->request->get("id"));
                        return serialize($test);
                    },
                    "cacheControlHeader"=>"public,max-age=600" //对应http头的Cache-Control,默认600s

                ],
            ];
        }




声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。