PHP.51-TP框架商城應用實例-前臺3-樓層推薦、TP框架雪崩問題

樓層推薦php

效果圖html

一、增長表字段數據庫

  商品表後端

   分類表數組

二、修改商品模型和分類模型接收字段is_floor緩存

三、修改商品和分類相關的表單併發

四、後臺製做推薦方法框架

  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控制器中取出數據this

   4.3在首頁中循環輸出   ==> 包括品牌信息

 五、爲前臺頁面生成緩存

 

擴展:解決TP框架雪崩問題

生成靜態緩存的雪崩問題:若是網站的併發量在100【每秒有100個刷新】,在緩存頁面失效的一瞬間,100個併發同時進入到後端數據庫有可能讓數據庫崩潰。

解決方法:修改TP底層源碼,在生成靜態緩存頁時加鎖,在緩存失效時只讓一個客戶端進入控制器      ==> PHP文件鎖

 

相關文章
相關標籤/搜索