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

今天看到一个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
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 28

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

3周前 评论

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

3周前 评论
Latent 2周前

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

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

Rust重构

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

给钱就给优化

3周前 评论

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

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

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

3周前 评论
你看我吊吗啊

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

3周前 评论

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

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

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

3周前 评论
mowangjuanzi

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

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

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

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

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

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

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

2周前 评论

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

2周前 评论

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

1周前 评论

好久不用 php 开发了,但不管啥语言大部分的优化思路都一样,基本都是 io 问题 常见的业务 io 都是 mysql 产生的:

1、代码中既然涉及到分页了,在查询大数据量的时候 count 会相对来说耗时,所以代码中去除 page 中的 count 语句,仅做分页,业务上实际总条数、总页面数 并不是很重要,这点可以考虑
2、索引优化:
模糊查询无索引,不要 count 能优化很多,考虑你这个肯定不能上 elastic
这种 title 字段与文字 id 单拉一张表,表的数据量变小点,可以提升一定速度,可以走异步更新,引擎换 myisam
索引该加加,但注意回表、最左原则,能避免避免
3、你文中提的大分页
要么禁用,要么子查询
如:select * from 表名 t (select id from 表名 order by id limit 9999999,10) a where t.id=a.id
5天前 评论
OrangBus (楼主) 5天前

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