PHP.51-TP框架商城应用实例-前台3-楼层推荐、TP框架雪崩问题
楼层推荐
效果图
1、增加表字段
商品表
分类表
2、修改商品模型和分类模型接收字段is_floor
3、修改商品和分类相关的表单
4、后台制作推荐方法
4.1在分类模型中增加获取前台楼层数据的方法
/****** 获取前台首页楼层中的数据 ***********/ public function floorData() { $floorData = S('floorData'); if($floorData) return $floorData; else { // 先取出推荐到楼层的顶级分类 $ret = $this->where(array( 'parent_id' => array('eq', 0), 'is_floor' => array('eq', '是') ))->select(); //var_dump($ret);die; $goodsModel = D('Admin/Goods'); // 循环每个楼层取出楼层中的数据 foreach ($ret as $k => $v) { /*********** 这个楼层中的品牌数据 *************/ // 先取出这个楼层下所有的商品ID $goodsId = $goodsModel->getGoodsIdByCatId($v['id']); // 再取出这些商品所用到的品牌 $ret[$k]['brand'] = $goodsModel->alias('a') ->join('LEFT JOIN __BRAND__ b ON a.brand_id=b.id') ->field('DISTINCT brand_id,b.brand_name,b.logo') ->where(array( 'a.id' => array('in', $goodsId), 'a.brand_id' => array('neq', 0), ))->limit(9)->select(); //var_dump($ret[0]['brand']);die; /**** 取出未推荐的二级分类并保存到这个顶级分类的subCat字段中 ****/ $ret[$k]['subCat'] = $this->where(array( 'parent_id' => array('eq', $v['id']), 'is_floor' => array('eq', '否'), ))->select(); //var_dump($ret[0]['subCat']);die; /****** 取出推荐的二级分类并保存到这个顶级分类的subCat字段中 *******/ $ret[$k]['recSubCat'] = $this->where(array( 'parent_id' => array('eq', $v['id']), 'is_floor' => array('eq', '是'), ))->select(); //var_dump($ret[0]['recSubCat']);die; /***** 循环每个推荐的二级分类取出分类下的8件被推荐到楼层的商品 ****/ foreach ($ret[$k]['recSubCat'] as $k1 => &$v1) { //取出这个分类下所有商品的ID并返回一维数组 $gid = $goodsModel->getGoodsIdByCatId($v1['id']); $gids = implode(",", $gid); //var_dump($gids);die; // 再根据商品ID取出商品的详细信息 $v1['goods'] = $goodsModel->field('id,mid_logo,goods_name,shop_price') ->where(array( 'is_on_sale' => array('eq', '1'), 'is_floor' => array('eq', '是'), 'id' => array('in', $gids), ))->order('sort_num ASC')->limit(8)->select(); //var_dump($v1['goods']);die; } } S('floorData', $ret, 5); return $ret; } }
4.2在IndexController.class.php控制器中取出数据
4.3在首页中循环输出 ==> 包括品牌信息
5、为前台页面生成缓存
扩展:解决TP框架雪崩问题
生成静态缓存的雪崩问题:如果网站的并发量在100【每秒有100个刷新】,在缓存页面失效的一瞬间,100个并发同时进入到后端数据库有可能让数据库崩溃。
解决方法:修改TP底层源码,在生成静态缓存页时加锁,在缓存失效时只让一个客户端进入控制器 ==> PHP文件锁