1. 程式人生 > >tp5快取應用例項

tp5快取應用例項

                                             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:當一個使用者第一次訪問此頁面是從資料庫裡查詢,再生成快取,下次,無論是這個使用者還是其他使用者(不論是不是第一次訪問)都是從快取裡取出資料;

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的名值都可以隨便寫,前後判斷保持一致就行