系统优化应该先从编码层面开始,这样能够让代码更容易维护,性能的提升很显著,又不会增加(反而会节省)硬件资源。接下来开始吧:
优化前页面ajax请求最高的达到6.75秒,这样的体验是很糟糕的。
从监控上可以看到几个优化点:
1. 接口get-charts-time-v3和get-new-sale都请求了2次,最好合并为一个;
2. 接口get-color-nums-v4和get-new-sale响应时间都在6秒以上,需要优化;
好了,开始工作:
1. 将多次请求合并为一个:
经过分析发现代码中是分别请求了两种类型的项目,原来只提供了查询某种类型项目数据的接口,所以要请求两次,为了合并为一次请求,要封装个接口,能够完成查询所有类型项目数据;
原来接口,需要判断传入参数来获取不同类型项目数据:
新增加接口,数据处理方法写到一个组件里:
/**
* 获取用户项目, 按状态统计
* @return InterfaceController
*/
public function getColorNumsV4(){
$count = $this->GetInfo->getUserProjectNumGroupByStatus();
$result = ['status' => 'success', 'data' => $count, 'message' => 'get color counts'];
return $this->returnJsonDataV1($result);
}
/**
* 获取用户所有项目, 按状态统计数量
* @return array
*/
public function getUserProjectNumGroupByStatus()
{
$query = $this->ProjectOverviews->find();
$count = $query->select(['status', 'count' => $query->func()->count('*')])
->group(['ProjectOverviews.status'])
->toArray();
foreach ($count as $eachCount) {
if ($eachCount['status'] === 1) $redNum = $eachCount['count'];
if ($eachCount['status'] === 2) $yellowNum = $eachCount['count'];
if ($eachCount['status'] === 3) $greenNum = $eachCount['count'];
}
$count = [$redNum, $yellowNum, $greenNum];
return $count;
}
可以看到这里把原来接口里糟糕的多次查询,整合为了一个。为了向下兼容,返回的数据做了格式处理,与原来接口一致。优化后接口响应时间降到了71ms:
2. 优化SQL、引入缓存
在不影响原有逻辑的前提下,优化接口代码:
可以看到判断逻辑进行优化,用关联查询取代原来的多步查询,接口性能有了很大提升,第一次请求没有缓存的情况下1.18s:
缓存命中的效率达到603ms:
Mac上PHPRedis扩展安装:
Mac上PHPRedis扩展安装:
下载:https://nodeload.github.com/nicolasff/phpredis/zip/master
解压并进入代码目录配置编译:
tar -zxvf phpredis-master.zip
cd phpredis
sudo phpize
./configure --with-php-config=/usr/local/opt/php/bin/php-config
make
make install
编译完成后扩展所在目录:/usr/local/Cellar/php/7.3.2/pecl/20180731/
编辑php.ini增加扩展:
vi /usr/local/etc/php/7.3/php.ini
增加:extension = redis;
重启apache:sudo apacheclt restart
最终页面的各项响应时间都在1s左右: