tp5缓存应用实例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41179401/article/details/86290293

                                             tp5缓存应用实例

这里的缓存类型是File

1  第一个例子:这里举例获取网站的文章导航,当用户第一次访问时是从数据库里查询数据,然后生成缓存文件,再次访问时直接从缓存里取数据(这也是最常见的缓存应用)

 这是一个博客网站的文章分类,用户第一次访问时是从数据库获取这些,然后生成缓存,下次就是直接从缓存里取数据

主页的控制器:

public function index()
    {
        //当有缓存是,直接从缓存里取出,第一次是没有的
        if(Cache::get('cate')){
            $this->assign('cate',Cache::get('cate'));
        }else{
        //用户第一次访问从数据库里取出数据,并生出缓存       
            $cate = Db::name('cate')->select();//文章分类
            $this->assign('cate',$cate);
            // 只要有一个用户访问后
            // 我们可以将文章的分类写到缓存中,缓存时间为一个小时
            Cache::set('cate',$cate,3600);
        }
    //..省略其他数据
}

知识延伸:如果网站后台更新了这些文章分类,该怎么办?

无论是更新,新增还是删除,如果有缓存直接重新设置缓存值即可

例如:新增一条文章分类

对应控制器:

public function add(){
	if($this->request->isPost()){
		$data['name'] = input('post.name'); //分类名称
		$data['date'] = time();             //添加时间
		$num = Db::name('cate')->insert($data); //新增一条文章分类
		if($num){
			// 如果有缓存 更新缓存
			if(Cache::get('cate')){
				$cate = Db::name('cate')->select();//重新获取文章分类
				Cache::set('cate',$cate,3600); //更新缓存
			}
			exit(json_encode(array('code'=>1,'msg'=>'添加成功')));
		}
	}
}

PS:当一个用户第一次访问此页面是从数据库里查询,再生成缓存,下次,无论是这个用户还是其他用户(不论是不是第一次访问)都是从缓存里取出数据;

扫描二维码关注公众号,回复: 4872029 查看本文章

2 第二个例子:用户第一次访问某篇文章时,阅读量加 +1 ,一段时间内再次访问阅读量 +1 ,过了这段时间这个用户再次访问阅读量才能再次 +1  

如果单纯的使用第一个例子的方法,那么结果就是:当第一个用户访问这篇文章后阅读量+1,而下次或者其他用户访问时就直接访问缓存文件,阅读量也不会+1(实际要的效果是其它用户访问时阅读量要+1),显然这个效果不是我们想要的。

这里的文章内容确实可以像第一个例子那样生成缓存,阅读量不能这么操作

原理:可以在用户第一次访问时,生成一个有存在时间(例如5分钟)的cookie,过了这段时间,就是这个cookie消失的时候再次访问才会+1(可以打开csdn的一篇文章查看,连续刷新查看阅读量,并没有改变,而等待一段时间后再次刷新阅读量会+1,就类似于这种效果)

控制器:details.php

public function details()
    {
        if($this->request->isGet()){
            $id = input('id'); //文章的id
            $article = Db::name('article')->where('id',$id)->find();//文章的信息
            if($article){  //如果这篇文章存在
                if(!Cookie::get('count')){ //有对应cookie
                    // 阅读量加1
                Db::name('article')->where('id',$article['id'])->setInc('readcount');
                    // 生成cookie
                    Cookie::set('count',sha1('随便写'),300);//时间为5分钟
                }
            }else{  //如果这篇文章不存在
                $this->redirect('error/index');
            }
            $this->assign('article',$article);
            return $this->fetch();
        }
    	
    }

PS:这里的cookie的名值都可以随便写,前后判断保持一致就行

猜你喜欢

转载自blog.csdn.net/qq_41179401/article/details/86290293
tp5