tp5快取應用例項
阿新 • • 發佈:2019-01-11
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的名值都可以隨便寫,前後判斷保持一致就行