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

今天看到一个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
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 28

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

1个月前 评论

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

1个月前 评论
Latent 1个月前

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

1个月前 评论
Imuyu 1个月前
ononl (作者) 1个月前
Jyunwaa

Rust重构

1个月前 评论
OrangBus (楼主) 1个月前

给钱就给优化

1个月前 评论

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

1个月前 评论
OrangBus (楼主) 1个月前
MArtian 1个月前
OrangBus (楼主) 1个月前

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

1个月前 评论
你看我吊吗啊

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

1个月前 评论

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

1个月前 评论
梦想星辰大海 1个月前

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

1个月前 评论
mowangjuanzi

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

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

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

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

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

1个月前 评论
OrangBus (楼主) 1个月前
mowangjuanzi (作者) 1个月前

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

1个月前 评论

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

1个月前 评论

我感觉还好,处理下代码格式,数据库关注一下代码中所用到的条件,数据库建立下索引,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
1个月前 评论
OrangBus (楼主) 1个月前

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