PHP.51-TP框架商城应用实例-前台3-楼层推荐TP框架雪崩问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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文件锁

 

 

 

以上是关于PHP.51-TP框架商城应用实例-前台3-楼层推荐TP框架雪崩问题的主要内容,如果未能解决你的问题,请参考以下文章

PHP.27-TP框架商城应用实例-后台3-商品修改删除

PHP.43-TP框架商城应用实例-后台16-商品属性3-库存量管理

PHP.40-TP框架商城应用实例-后台17-商品属性3-商品分类的修改与删除

PHP.48-TP框架商城应用实例-后台23-权限管理-权限验证

TP框架 商城前台用户注册方法

PHP.36-TP框架商城应用实例-后台14-商品管理-商品扩展分类的删除修改