关于页面优化一直是一个让人头痛的问题,除了修正那些不负责任的代码外,要考虑的因素还有很多。系统优化,我觉得就好比医生治病,你必须准确的找到病因,手起刀落,干净利索。今天就遇到了一个重症患者。

问题描述

之前做了一个综合展示页面,这个页面布局就想一个桌子,上面摆满了,水果,青菜,大鱼大肉,还有碗筷刀叉,总之东西很多,所以页面显示很慢。打开页面会有10s左右的卡死状态。老大让我解决这个问题。

问题分析

首先。浏览器F12查看请求量,除去权限控制,最大请求个数大概 十几个, 而且,当时的开发者为了解决初始化慢的问题,把绝大多数请求都放到 js 里,所以 页面初始化完毕之后, js 还在不停的向后台请求数据,造成了页面卡住的现象。
然后逐一去看这些请求,除了自己写查库等基本操作,还有从之前写接口获取的数据,还有从三方支持的接口获取的数据。
分析日志,并没有耗时特别长的sql。
最后归纳一下分析出来的问题
  1. 请求数量太多
  2. 原接口无用数据太多
  3. 三方接口效率低

解决方案

  • 把多个请求归纳到一个。减少通信消耗时间
  • 重写获取数据方法,去除掉所有无用操作和无用数据。
  • 分发,异步执行多任务,然后统一返回,去除同步执行代码消耗时间。
  • 对于一些耗时长的逻辑加缓存

技术实现

gearman实现异步分发处理任务

关于gearman 的安装和基本概念就不赘述了,我就简述一些我使用gearman 如何并发执行多任务的过程。
不多BB,直接上代码

public function testTask($uid){$GLOBALS['_gm'] = [];  //因为要把回调函数里边的数据拿出来,目前想到的就是用全局变量来处理$client = new \GearmanClient();$client->addServer($server, $port);$client->setCompleteCallback(function($task) {$GLOBALS['_gm'][$task->unique()] = json_decode($task->data(), true);});$client->setTimeout(3000);$client->addTask("function1", json_encode($fileData), '', 'data1');$client->addTask("function2", json_encode($fileData), '', 'data2');$client->addTask("function3", json_encode($fileData), '', 'data3');$client->addTask("function4", json_encode($fileData), '', 'data4');$client->addTask("function5", json_encode($fileData), '', 'data5');$client->addTask("function6", json_encode($fileData), '', 'data6');$client->addTask("function7", json_encode($fileData), '', 'data7');$client->addTask("function8", json_encode($fileData), '', 'data8');if ($client->runTasks()) {return $GLOBALS['_gm'];} else {return false;}}

一些解释:

  • setCompleteCallback() : 文档里边有具体描述。  当 task complete 时 回调, 这边我需要拿到任务处理完毕后的数据,而且需要标记哪个结果对应哪个任务(后来想了一下,也可以在返回值里加标记),addTask 的 第四个参数用来标记任务,当全部处理完毕后,获取所有数据。
  • 因为在回调方法里不能操作一般变量,所以用全局变量来获取返回值。
  • setTimeout 是设置执行时间,如果不设置的话,当worker 程序出错不能及时返回的话,系统会一直卡主直到502。
后端代码
/*** [getWorker 获取worker]* @DateTime 2018-01-25T19:03:19+0800* @return   [type]                   [description]*/public function getWorker(){$worker    = new \GearmanWorker();$worker->addServer($server, $port);//$worker->addFunction("funciton1", function($job){$data = $job->workload();$params = json_decode($data, true);...return json_encode($data1);});$worker->addFunction("funciton2", function($job){$data = $job->workload();$params = json_decode($data, true);...return json_encode($data2);});....return $worker;}/*** [testWorker 执行脚本]* @Author   xuao* @DateTime 2018-01-25T19:03:35+0800* @return   [type]                   [description]*/public function testWorker(){$worker = $this->getHrWorker();while ($worker->work());}

说明:

  • getWorker() 负责提供一个 注册 function1-8的worker。
  • 执行testWorker() 启动worker,通过启动多个进程可以启动多个worker。本人用superviser 来管理进程,并且 suiperviser 支持同一脚本启动多个进程。
  • 如果感兴趣的话可以加一些输出,是真正的异步执行。关于并发执行任务就介绍完毕。

加 redis 缓存解决频繁统计数据问题

获取的这些数据中,有一部分数据变更不是很频繁,并且有一个特点是,只有添加数据,没有编辑数据。然后我采用了这样的缓存方案。
先根据查询条件查到需要的数据,然后把 查询条件 和 查询的数据的最大id 拼起来拼成key ,然后对查询到的数据进行处理, 把处理完的数据作为 value, key => value 存到redis 并设置过期时间。 
当再次执行该函数的时候,先查询缓存中是否有对应的数据,如果有,拿出来,并更新过期时间,如果没有, 重新获取,并重新生成缓存。
使用的扩展是 phpredis。 

结果

这一套整完之后,再打开这个页面, 1s 以内全部请求结束,舒服。
关于业务层面一些具体实现,因为没有跟产品沟通,就对具体逻辑没有做调整,所以,依然有优化空间。

多请求多数据量综合页面优化方案相关推荐

  1. SEO页面优化方案指南

    一般小企业的SEO专员只能拿到正常运行的网站,公司也没有程序员无法修改网站整体结构.那么一份优秀的SEO页面优化方案显得极其重要,可以利用长尾词的优势将内容页在搜索引擎中获取良好的排名. 一.标题ti ...

  2. 禁止搜狗引擎收录php动态页面,优化方案:搜搜跟搜狗好像变得更加不爱收录页面...

    优化方案:搜搜跟搜狗好像变得更加不爱收录页面 小编的SEO搏客沒有应用301跳转,关键是云虚拟主机不兼容,也好.以前提到URL规范化的5条提议也略微提及,但忽视了一种状况. 一般状况下,人们在搜索结果 ...

  3. elasticsearch亿级数据量全量索引导入优化方案

    Hbase scan读取时候,调大 hbase.client.scanner.timeout.period 超时时间,不然可能会跑异常 org.apache.hadoop.hbase.UnknownS ...

  4. 页面优化指南(easyui页面优化方案

    http://www.easyui.info/archives/1435.html http://www.360doc.com/content/14/0209/08/9200790_350899585 ...

  5. web 折线图大数据量拉取展示方案_【第2010期】QQ音乐Android客户端Web页面通用性能优化实践...

    前言 今日早读文章由QQ音乐客户端开发工程师@关岳分享,公号:云加社区(ID:QcloudCommunity,腾讯云官方开发者社区)授权分享. 正文从这开始~~ QQ音乐 Android 客户端的 W ...

  6. 移动端页面性能优化方案

    移动端页面性能优化方案 加载优化 使用首屏加载 按需加载 预加载 压缩图片 减少Cookie 异步加载第三方资源 脚本执行优化 CSS优化 JavaScript执行优化 渲染优化 SEO(搜索引擎优化 ...

  7. 浅谈移动端页面性能优化方案

    众所周知,在互联网行业里,移动端占有的比例越来越高了,尤其实在电商领域,用户购物大部分在移动端.比如淘宝双11,在移动端支付的接近7成.这就要求我们产品质量越来越高,那对于我们前端工程师来说也是一个挑 ...

  8. MySQL深度分页的问题及优化方案:千万级数据量如何快速分页

    前言 后端开发中为了防止一次性加载太多数据导致内存.磁盘IO都开销过大,经常需要分页展示,这个时候就需要用到MySQL的LIMIT关键字.但你以为LIMIT分页就万事大吉了么,Too young,to ...

  9. ajax ssm 页面跳转_Shiro 教程,Ajax请求拦截跳转页面方案

    我们知道Ajax不能做页面redirect和forward跳转,所以Ajax请求假如没登录,那么这个请求给用户的感觉就是没有任何反应,而用户又不知道用户已经退出或是  Session  超时了.这个时 ...

最新文章

  1. oracle10g删除asm组,Oracle 10G RAC 删除已有节点
  2. 如何用xmanager远程连接centos6.0的桌面
  3. Django模板用法
  4. 基于form的身份验证怎样设置一个特例(使某页不需要验证)
  5. Delphi异常处理总结
  6. python新人一月工资_python【项目】:工资管理(简易版)
  7. matlab中uint16(uint8)函数的用法
  8. Got minus one from a read call异常
  9. Guns 代码生成演示_入门试炼02
  10. Android学习笔记---16_采用SharedPreferences保存用户偏好设置参数
  11. 深海迷航创造模式火箭怎么飞_深海迷航被玩成养鱼游戏 奇葩玩家的养殖之路...
  12. 1008 数组元素循环右移问题(C语言)
  13. 打谱软件-Avid Sibelius 8.5.0 macOS
  14. iOS 新浪微博客户端Demo实践之(六) 微博评论列表页面和发评论
  15. 微信h5 支付,已经获得weixin://wap/pay?prepayid,但是无法调起微信客户端支付
  16. 加密狗登录PHP开发,C# 使用加密狗登录 示例源码
  17. C/C++快速读写磁盘数据的方法
  18. 加强银行余额调节表在财务管理中的作用
  19. 2021年广州市学历入户全流程(持续更新)
  20. OPenGL 学习笔记之 VAO VBO EBO 以及SHADER 并使用其绘制三角形

热门文章

  1. lerna: 最佳实践
  2. Vue项目实战之人力资源平台系统(七)员工管理模块
  3. 【微信公众平台】SAE接入
  4. 批量给pdf加水印,pdf批量加水印方法
  5. Android 插件化,qihoo360插件方案。集成简单实用方便,兼容性高
  6. php qqwry.dat_利用PHP或者python实现纯真数据库qqwry.dat的自动更新
  7. 河南城市批判——郑州市
  8. 完善小视频功能以及即时通讯
  9. 周鸿祎:互联网的过去、现在和未来
  10. 移动H5首屏秒开优化方案