在页面初始化加载的时候,经常会进行重复性的数据库访问,如果数据库存储量过大,那么等待的时间将会很长,thinkPHP 提供了多种关于数据缓存的方式。对于不经常变动的、经常查询的表数据进行数据缓存可以加快系统运行速度,使用户体验效果得到很好的提升。
以下代码利用 tp 的 F 方法来进行数据缓存,首先获取到 sql 语句,并通过 MD5 加密的方式来进行缓存文件的命名,如果系统存在该 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);
}
}
对于编辑类的操作(新增、修改、删除),则需要进行缓存文件的清除
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);
}
}