网站优化,敢各位大佬这个网站给多少钱能优化?

今天看到一个cms的网站很卡,老板叫我优化有以下,下面是具体的方法

/**
     * 文章列表获取
     */
    public function arcList()
    {

        // 定义全局查询条件
        $map = []; // 将所有的查询条件封装到这个数组中

        $site_id = 0;
        if(Request::param('site_id')){
            $site_id=Request::param('site_id');
        }
        $map[] = ['site_id', '=', $site_id];

        // 搜索功能
        $keywords = Request::param('keywords');
        if ( !empty($keywords) ) {
            $map[] = ['title', 'like', '%'.$keywords.'%'];
        }
        $cid = Request::param('cid');

        $integral = Request::param('integral');
        $attr = Request::param('attr');


        if(Request::param('datebt')){
            $datebt = Request::param('datebt');
            $datearr=explode(" - ",$datebt);
            $datebegin=strtotime($datearr['0']);
            $dateend=strtotime($datearr['1']);
            $map[] = ['updatetime','between',[$datebegin,$dateend]];
        }

        $cateorg=ArcCate::order('sort')->select()->toArray();

        if(isset($cid)){
            $cids=getChildsId($cateorg,$cid);
            array_push($cids,$cid);//所有子类cID+自身cID
            if($cids){
                $map[] = ['cid','in',$cids];
            }
        }



        if(isset($integral)) {
            if ($integral != 'all') {
                $map[] = ['integral', '=', $integral];
            }
        }

        if(isset($attr)) {
            if ($attr != 'all') {
                $map[] = [$attr, '=', 1];
            }
        }

        $map[]=['del','=',0];
        // 定义分页参数
        $limit = isset($_GET['limit']) ? $_GET['limit'] : 10;
        $page = isset($_GET['page']) ? $_GET['page'] : 1;

        /**
        $arcList = ArcModel::where($map)
        -> alias('a')
        -> join(['wy_cate' => 'c'], 'a.cid = c.id')
        -> order('a.id', 'desc')
        //-> field('a.id,a.cid,a.title,a.createtime,a.updatetime,a.click,c.name')
        -> field(['a.id','a.cid','a.title','a.createtime','a.updatetime','a.click','c.name'])
        -> page($page,$limit)
        -> select();
         * **/


        $arcList=ArcModel::where($map)
            ->withoutField('content')
            ->withSum(['scoreTotal' => 'total'], 'score_in')
            ->withSum(['scoreForward' => 'forward'], 'score_in')
            ->withCount(['timesTotal' => 'times'])
            ->with(['arcCate'])
            ->order('id','desc')
            ->page($page,$limit)
            ->select();

        //dd($arcList->toArray());

        //$total = count($arcList);
        $total=count(ArcModel::where($map)->select());
        $result = array("code" => 0, "msg" => "查询成功", "count" => $total, "data" => $arcList);
        return json($result);

        // 设置模板变量
        View::assign('arcList', $arcList);

        // 渲染模板
        View::fetch();
    }

很难理解这是10多年开发的人写出来的代码,统计居然将所有的文章查询出来进行计数

$total=count(ArcModel::where($map)->select());

而且这分页跟没分页有啥区别?

// 定义分页参数
$limit = isset($_GET['limit']) ? $_GET['limit'] : 10;
$page = isset($_GET['page']) ? $_GET['page'] : 1;

如果是我page=1,limit=1 那还好

网站优化,敢各位大佬这个网站给多少钱能优化?

那如果我 page=9999999999999999999999999999999999999999&limit=9999999999999999999999999999999999999999 敢问阁下又将如何应对?

网站优化,敢各位大佬这个网站给多少钱能优化?

不知道大家遇到这种情况应该报价多少?

下面说说我的看法:
1、请求的参数尽量用类型限制,防止用户恶意传参

$page = (int)request("page");

2、对于返回数据的条数,应该设置一个最大值,你永远不知道用户会给你传多大

public function getLimit(int $defaultLimit = 10,int $maxLimit=100)
    {
        $limit = (integer)request("limit", $defaultLimit);
        if ($limit >= $maxLimit) {
            $limit = $maxLimit;
        }
        return $limit;
    }

当我们使用框架查询的时候,一般 paginate 已经携带查询的总条数了

$data = ModelName::latest("id")->paginate($this->getLimit());
return $this->resData($data->items(), $data->total())

3、关于关联查询或者统计,可通过模型关联的方式进行查询,这样看上去简单直了

$data = ModelName::with("user")->withCount("log")->paginate($this->getLimit());

看到100+的列表查询,我知道今晚又该加班了。。。

本作品采用《CC 协议》,转载必须注明作者和本文链接
保持勇敢,坚持有趣,生命不息,折腾不止。
OrangBus
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 26

加缓存呗 还能咋优化 这是列表显示数据 又没法做到异步化

2周前 评论

代码优化归优化,但是你一个正常访问的用户 无聊到什么 9999999 99999999999 ,那就不要访问呗。

2周前 评论
Latent 1周前

分页不就是这么写的吗。非正常用户爱访问不访问。设置接口请求速率上限,活该这种人卡。

2周前 评论
Imuyu 2周前
ononl (作者) 2周前
Jyunwaa

Rust重构

2周前 评论
OrangBus (楼主) 2周前

给钱就给优化

2周前 评论

这种代码感觉没啥性能问题,大概率是服务器带宽或者图片加载慢。你让AI给你优化重写一下,还是慢直接列表加个缓存。

2周前 评论
OrangBus (楼主) 2周前
MArtian 2周前
OrangBus (楼主) 2周前

把列表數據緩存起來,半天或是或是一天是更新一次,

2周前 评论
你看我吊吗啊

mysql 应该是能开缓存 ,但是感觉效果不会很明显 ,只要是分页了 就没啥优化余地 ;count那个 直接删掉 ,用page返回的页码 处理翻页

2周前 评论

他不这样写你怎么有机会接到这个单子

2周前 评论
梦想星辰大海 2周前

代码逻辑不合理,过渡查询了。

2周前 评论
mowangjuanzi

可优化的地方其实还是挺多的。

首先,就是关于计算总量,这个可以考虑使用 redis 进行替代。平常就是创建文章+1,隐藏文章-1。然后每天晚上半夜可以通过执行SQL,进行总量修正。

再者关于列表,可以通过创建多列索引,通过覆盖索引查询数据。对于分页数据,先查询出ID来,然后再通过ID查询文档详情即可。

再者分页的话,其实可以使用上一页和下一页实现。去掉展示总页数的想法。Laravel 的查询使用 forPage 实现。

如果还带着搜索的话,那么使用 MySQL like 查询就不可取了。推荐使用 ElasitcSearch。当然这种成本会高很多。应该有很多低成本的方法,具体可以自己查询。

2周前 评论
OrangBus (楼主) 2周前
mowangjuanzi (作者) 2周前

cms正常优化思路其实就一条,整站静态,优化sql 的效果 没有 整站静态 来的 彻底,打得一拳开免得百拳来。

2周前 评论

可以给你优化到秒开,你能出多少优化费

2周前 评论

我感觉还好,处理下代码格式,数据库关注一下代码中所用到的条件,数据库建立下索引,select所需要数据,就很快了。

4天前 评论

空间换时间

18小时前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!