Apr
18
2017
记一次判断错误所引起的缓存失败问题
我习惯用empty来检测数据,今天碰到了个缓存失败问题,之前的代码如下:
// 根据分类动作获取应用列表 public function getListByAction($action=''){ $cacheName='appListByAction('.$action.')V1'; $appList=cache($cacheName); if(empty($appList)){ //如果缓存未设置 $cid=Db::name('appCategory')->where('action',$action)->value('id'); $appModel=Db::name('app')->where('status',1); if(!empty($cid)){ $appModel->where('cid',$cid); } $appList=$appModel->select(); cache($cacheName,$appList,604800); // 缓存一星期 } return $appList; }
我在缓存以下两个数据的时候都是好好的:
- appListByAction()V1
- appListByAction(show)V1
但是缓存appListByAction(sale)V1的时候出了问题,最终排查出了问题。
实际缓存存入是成功了,但是这个$appList的内容是个空数组,所以第二次再访问数据的时候,判断是否有缓存那出现问题了,empty支持判断为空的类型范围比较多,可以看如下:
- "" (an empty string)
- 0 (0 as an integer)
- 0.0 (0 as a float)
- "0" (0 as a string)
- NULL
- FALSE
- array() (an empty array)
- $var; (a variable declared, but without a value)
因为$appList=array(),empty($appList)为true,所以,缓存操作又一次的被执行了。
我们只要将判断改为if($appList===false),注意这里用了恒等,确保阻止array()==false为true的情况发生
发表评论: