重构代码,解决商城加载太慢总结

简介:

商城加载太慢,分析原因。
1.图片大,加载慢

2.数据查询多,加载慢

处理一,通过lazyload来延迟图片加载,效果一般。

处理二,重构查询

原来的查询,分类获取商城数据,每多一个分类,就要多一次数据查询。这个很耗费时间。

foreach ($this->category as $k => $v) {
    $where       = array();
    $content_arr = unserialize($mallCategoryModel->where(array(
        'id' => $v['id']
    ))->getField('content'));
    if (empty($content_arr)) {
        $content_arr = array();
    }
    $content_str = implode(',', $content_arr);
    
    if ($v['type'] == 1) { // 商铺
        $where['a.status']             = 1;
        $where['a.id']                 = array(
            'in',
            $content_str
        );
        $storelist                     = M()->table('sh_store a')->join('sh_category b on a.category_id = b.id')->join('sh_store_shop c on a.id = c.store_id and c.member_id =' . $this->member_id)->where($where)->field('a.id as store_id,a.token,a.name as store_name,a.topbg,a.intro,a.logo,a.category_id,b.name as category_name,c.id as shop_id')->order('find_in_set(a.id,"' . $content_str . '")')->select();
        $categoryData[$k]['storelist'] = $storelist;
    } else { // 商品
        $where['a.status']             = 1;
        $where['b.status']             = 1;
        $where['b.id']                 = array(
            'in',
            $content_str
        );
        $goodslist                     = M()->table('sh_store a')->join('sh_goods b on b.store_id = a.id')->join('sh_store_shop c on a.id = c.store_id and c.member_id=' . $this->member_id)->where($where)->field('a.name as store_name,a.token,b.id as goods_id,b.price,b.oprice,b.name as goods_name,b.logoimg,b.salecount,b.fakemembercount,c.id as shop_id')->limit('10')->order('find_in_set(b.id,"' . $content_str . '")')->select();
        $categoryData[$k]['goodslist'] = $goodslist;
    }
}

慢就慢在要多次查询数据库,分类越多,查询次数越多。

重构思路,一次获取所有数据,分类进行整合。


// 重构提升加载速度
$store_content_str = $goods_content_str = '';
foreach ($this->category as $k => $v) {
    $content_arr = unserialize($mallCategoryModel->where(array(
        'id' => $v['id']
    ))->getField('content'));
    if (empty($content_arr)) {
        $content_arr = array();
    }
    $content_arr = array_slice($content_arr, 0, 6); //获取每组分类的前6条数据
    $content_str = implode(',', $content_arr);
    if ($v['type'] == 1) { // 店铺
        if ($store_content_str == '') {
            $store_content_str .= $content_str;
        } else {
            $store_content_str .= ',' . $content_str;
        }
    }
    
    if ($v['type'] == 2) { // 店铺
        if ($goods_content_str == '') {
            $goods_content_str .= $content_str;
        } else {
            $goods_content_str .= ',' . $content_str;
        }
    }
}

// 获取所有自定义商品
$wheregoods             = array();
$wheregoods['a.status'] = 1;
$wheregoods['b.status'] = 1;
$wheregoods['b.id']     = array(
    'in',
    $goods_content_str
);
$goodslist              = M()->table('sh_store a')->join('sh_goods b on b.store_id = a.id')->where($wheregoods)->field('a.name as store_name,a.token,b.id as goods_id,b.price,b.oprice,b.name as goods_name,b.logoimg,b.salecount,b.fakemembercount')->select();

// 获取所有自定义商铺
$wherestore             = array();
$wherestore['a.status'] = 1;
$wherestore['a.id']     = array(
    'in',
    $store_content_str
);
$storelist              = M()->table('sh_store a')->join('sh_category b on a.category_id = b.id')->join('sh_store_shop c on a.id = c.store_id and c.member_id =' . $this->member_id)->where($wherestore)->field('a.id as store_id,a.token,a.name as store_name,a.topbg,a.intro,a.logo,a.category_id,b.name as category_name,c.id as shop_id')->select();

// 重新组装,获取相应的店铺或商品
foreach ($this->category as $k => $v) {
    $content_arr = unserialize($mallCategoryModel->where(array(
        'id' => $v['id']
    ))->getField('content'));
    if (empty($content_arr)) {
        $content_arr = array();
    }
    $content_arr = array_slice($content_arr, 0, 6); // 获取前六条数据
    if ($v['type'] == 1) { // 店铺
        if (count($content_arr) > 0) { // 获取相应的store数据
            $storedata = array();
            foreach ($content_arr as $k_store => $v_store) {
                foreach ($storelist as $k_s_list => $v_s_list) {
                    if ($v_s_list['store_id'] == $v_store) {
                        $storedata[] = $v_s_list;
                        continue 2;
                    }
                }
                
            }
        }
        $categoryData[$k]['storelist'] = $storedata;
        
    } else { // 商品
        if (count($content_arr) > 0) { // 获取相应的goods数据
            $goodsdata = array();
            foreach ($content_arr as $k_goods => $v_goods) {
                foreach ($goodslist as $k_g_list => $v_g_list) {
                    if ($v_g_list['goods_id'] == $v_goods) {
                        $goodsdata[] = $v_g_list;
                        continue 2; // 跳出两层,直接到达content_arr的foreach中,if也算一层
                    }
                }
            }
        }
        $categoryData[$k]['goodslist'] = $goodsdata;
    }
}

减少了查询次数,增多了php对数据的处理。综合评定,重构后,速度提升了很多。



本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/5340993.html,如需转载请自行联系原作者


相关文章
|
8月前
|
JavaScript 前端开发 Java
面试官:你的项目有什么亮点?我:解决了JS脚本加载失败的问题!
面试官:你的项目有什么亮点?我:解决了JS脚本加载失败的问题!
|
8月前
|
自然语言处理 算法 开发者
你体验过让大模型自己写代码、跑代码吗?
通义千问在代码编写和运行上展现不俗实力,尤其擅长处理简单逻辑和算法,能将自然语言转化为可执行代码,助力快速原型设计。然而,面对复杂任务和专业领域知识时,其表现有待提升。优化策略包括细化需求、提供示例代码、迭代反馈和结合领域知识。随着持续优化,未来编程助手将更智能高效。
|
3月前
|
缓存 前端开发 JavaScript
前端架构思考:代码复用带来的隐形耦合,可能让大模型造轮子是更好的选择-从 CDN 依赖包被删导致个站打不开到数年前因11 行代码导致上千项目崩溃谈谈npm黑洞 - 统计下你的项目有多少个依赖吧!
最近,我的个人网站因免费CDN上的Vue.js包路径变更导致无法访问,引发了我对前端依赖管理的深刻反思。文章探讨了NPM依赖陷阱、开源库所有权与维护压力、NPM生态问题,并提出减少不必要的依赖、重视模块设计等建议,以提升前端项目的稳定性和可控性。通过“left_pad”事件及个人经历,强调了依赖管理的重要性和让大模型代替人造轮子的潜在收益
|
5月前
|
监控 小程序 数据处理
揭秘支付宝小程序性能优化秘籍:从加载到运行,每一步都快人一步!
【8月更文挑战第27天】本文深入探讨了支付宝小程序性能优化的关键技术和策略,包括减少网络请求、利用CDN加速、代码按需加载、图片压缩、懒加载以及性能监控等多方面内容,并提供了实用的示例代码,帮助开发者显著提升小程序的加载速度与运行效率,创造更佳用户体验。
110 1
|
5月前
|
缓存 JavaScript 前端开发
前端10种火火火火的优化代码性能方法!避免代码跑起来像蜗牛!
前端10种火火火火的优化代码性能方法!避免代码跑起来像蜗牛!
|
8月前
|
小程序
小程序的分包加载具体流程
小程序的分包加载具体流程
255 0
|
8月前
|
人工智能 自然语言处理 算法
你体验过让大模型自己写代码、跑代码吗?
【4月更文挑战第10天】你体验过让大模型自己写代码、跑代码吗?
|
Web App开发 缓存 JSON
可以用到项目的优化网站加载速度方案
可以用到项目的优化网站加载速度方案
82 0
|
敏捷开发 数据可视化 搜索推荐
大话项目:项目多、乱、慢,怎么管理项目更高效?
根据国外调查统计,大部分的企业会同时进行11-25个项目。那么现在,当前你的团队同时进行多少个项目呢?是完全没有数据支撑、两眼一抹黑,还是超过了这个平均值?