在页面初始化加载的时候,常常会进行重复性的数据库访问,若是数据库存储量过大,那么等待的时间将会很长,thinkPHP 提供了多种关于数据缓存的方式。对于不常常变更的、常常查询的表数据进行数据缓存能够加快系统运行速度,使用户体验效果获得很好的提高。php
如下代码利用 tp 的 F 方法来进行数据缓存,首先获取到 sql 语句,并经过 MD5 加密的方式来进行缓存文件的命名,若是系统存在该 sql 语句的文件,则获取到缓存数据,若是不存在,则进行数据库链接,并将查询结果进行缓存。sql
protected function _getTableJson($sql, $model=null){ $model = $model ? $model : M(MODULE_NAME); // 实例化对象 $startRows = ($_POST["page"]-1)*$_POST["rows"]; // 获取分页信息,计算开始字段 $endRows = $_POST["page"] * $_POST["rows"]; // 获取分页信息,计算结束字段 $sort = $_POST["sort"]; $order = $_POST["order"]; // 获取排序字段 $orderBy = $sort ? "ORDER BY $sort $order" : ""; $sqlCount = "SELECT COUNT(*) AS tp_count FROM($sql)"; $sqlRows = "SELECT * FROM (SELECT thinkphp.*, rownum AS numrow FROM ( $sql $orderBy)thinkphp) WHERE (numrow > $startRows) AND (numrow <= $endRows)"; $count = $this->judgeCache($sqlCount, $model); $count = intval($count[0]['tp_count']); if(0 == $count){ $res['total'] = 0; $res['rows'] = ''; echo json_encode($res); die(); } $list = $this->judgeCache($sqlRows, $model); $res['total'] = $count; $res['rows'] = $list; echo json_encode($res); } // 判斷是否存在緩存數據,存在獲取數據,不存在鏈接數據庫 function judgeCache($sql, $model){ $fileName = MODULE_NAME.'/'.MD5($sql); // 緩存文件名,进行 MD5 加密 // 判断缓存文件是否存在 if(false === F($fileName)){ $data = $model->query($sql); F($fileName, $data); return $data; }else{ return F($fileName); } }
对于编辑类的操做(新增、修改、删除),则须要进行缓存文件的清除thinkphp
function delCacheFile( $dirName ) { $dirName = $dirName?$dirName:DATA_PATH.MODULE_NAME; if($handle=opendir($dirName)){ while(false !== ($item=readdir($handle))){ if($item!="."&&$item!=".."){ if(is_dir("$dirName/$item")){ $this->delCacheFile("$dirName/$item"); }else{ unlink("$dirName/$item"); } } } closedir($handle); rmdir($dirName); } }