网站优化,敢各位大佬这个网站给多少钱能优化?
今天看到一个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 协议》,转载必须注明作者和本文链接
关于 LearnKu
加缓存呗 还能咋优化 这是列表显示数据 又没法做到异步化
代码优化归优化,但是你一个正常访问的用户 无聊到什么 9999999 99999999999 ,那就不要访问呗。
分页不就是这么写的吗。非正常用户爱访问不访问。设置接口请求速率上限,活该这种人卡。
用
Rust重构给钱就给优化
这种代码感觉没啥性能问题,大概率是服务器带宽或者图片加载慢。你让AI给你优化重写一下,还是慢直接列表加个缓存。
把列表數據緩存起來,半天或是或是一天是更新一次,
mysql 应该是能开缓存 ,但是感觉效果不会很明显 ,只要是分页了 就没啥优化余地 ;count那个 直接删掉 ,用page返回的页码 处理翻页
他不这样写你怎么有机会接到这个单子
代码逻辑不合理,过渡查询了。
可优化的地方其实还是挺多的。
首先,就是关于计算总量,这个可以考虑使用 redis 进行替代。平常就是创建文章+1,隐藏文章-1。然后每天晚上半夜可以通过执行SQL,进行总量修正。
再者关于列表,可以通过创建多列索引,通过覆盖索引查询数据。对于分页数据,先查询出ID来,然后再通过ID查询文档详情即可。
再者分页的话,其实可以使用上一页和下一页实现。去掉展示总页数的想法。Laravel 的查询使用 forPage 实现。
如果还带着搜索的话,那么使用 MySQL like 查询就不可取了。推荐使用 ElasitcSearch。当然这种成本会高很多。应该有很多低成本的方法,具体可以自己查询。
cms正常优化思路其实就一条,整站静态,优化sql 的效果 没有 整站静态 来的 彻底,打得一拳开免得百拳来。
可以给你优化到秒开,你能出多少优化费
5W
我感觉还好,处理下代码格式,数据库关注一下代码中所用到的条件,数据库建立下索引,select所需要数据,就很快了。
空间换时间
好久不用 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