V2ES 项目优化

By | 2017年6月28日 | 阅读:444 次

前言
到目前为止,V2ES 项目后端全部开发并测试完成,但也存在比较明显的问题:加载慢;在项目中除了 laravel 必须的组件,还添加了如 faker、scout 等组件,以及每次处理请求 laravel 都会实例化很多对象,网站加载速度慢也就情有可原了;但是 laravel 也有值得优化的地方,下边就在 V2ES 项目上实践下


  1. laravel 自带的优化方案
  2. 使用 larval Debugbar 来和预加载来优化数据库请求
  3. 使用 laravel DB::listen 监听查询事件

1. laravel 自带的优化方案

1.1 路由缓存的优化

  • 在 V2ES 项目中,使用了分组路由、auth 中间件路由等,每次请求到来时都会去解析和注册 routes/ 下的各个路由,为避免注册路由的时间消耗使用路由缓存,请求到来时直接交由缓存好的路由对象处理,手册上甚至说在大型项目中使用路由缓存某些情况下响应可以提速百倍;

  • 生成路由缓存:

  • 要注意的 3 个点
    • 路由缓存不支持自动更新,即是新加入的路由不会生效,所以一般在生产环境才打开路由缓存;

    • 注意路由缓存不支持闭包的路由,比如项目的第一个路由 return view('welcome');

    • 在路由中使用了 include ,需要手动将被包含的路由添加到该 include 位置;

1.2 配置缓存的优化

  • 当请求到来时,laravel 会读取 /config/*.php.env 等配置文件,耗费资源和时间;

    使用 laravel 自带的配置缓存,可将配置文件的配置项合并到缓存文件, 在处理请求时减少载入的文件数量

  • 生成配置缓存:

  • 注意:和路由缓存一样,配置缓存也不支持自动更新,一般在开发环境不使用路由、配置缓存;

1.3 类映射加载优化

  • laravel 使用了 PSR4 自动加载标准,命名空间和文件夹之间一一对应 ,但在类被实例化调用时,还是需要通过命名空间一层层的解析目录再去找到类定义文件;laravel 提供了类名和类定义文件之间的直接映射,可以减少文件的加载达到优化的目的;

  • 缓存类的映射


2. 使用 larval Debugbar 来和预加载来优化数据库请求

2.1 laravel-debuger的使用

  • 项目:laravel-debugbar;安装参考你 readme.md 即可;
  • 作用:可以像 Chrome 的开发者工具一样,看到 laravel 项目的页面上加载了哪些视图,页面进了哪些查询,耗时多少等;

2.2 V2ES 项目首页优化

  • V2ES 首页加载得较慢,打开 debugbar 查看页面进行了很多次 SQL 请求,如下:

    可以看到,在文章列表页,进行了 5 次 users 表的查询,在列表中可查看每次查询的耗时;

  • 分析问题:在列表页取出文章数据时,关联了用户表输出作者信息,获取作者信息操作是在模板中使用 @foreach 完成的查询;

    页面不必要的查询发生在 {{$post->user->id}}{{$post->user->name}} 的重复联合查询上;

2.3 使用预加载

  • 可在 Controller 中先将 users 表预加载后,再分配给模板显示;

  • 预加载效果:在 C 层将关联数据取出,在 View 层直接从结果集中取出值渲染即可,只进行了 1 次 users 表的查询;

  • 还可以在 index.php 中取出关联的 users 传递给模板,这样在模板上就不会进行 users 的查询;

  • MVC 模式中,一般对数据的操作都是在 Controller 层完成的,View 层负责渲染即可;所以尽量避免在 View 层使用了模型关联等进行数据库操作,尤其是列表数据;为了代码的简洁性在 View 上使用查询,可使用预加载方式分配数据;

3. 使用 laravel DB::listen 监听查询事件

  • 手册参考:laravel 数据库操作

  • 在页面响应十分缓慢,而 laravel-debugbar 显示页面上没有耗时 SQL 时(debugbar 不知道页面无关的数据库操作),可以查看 MySQL 的查询日志或者使用 laravel 自带的监听方法来分析 SQL 查询;

  • 查看超过时间的 SQL(或者 tail -f storage/logs/laravel.log 动态查看日志 )


后记
对 V2ES 项目的文章列表页的简单优化就是这些,其实真正考虑到优化时会先从带宽、网络延时等主机配置着手,加入七牛 CDN 加速等,再考虑代码和SQL层面的优化,当然,在写代码时能直接考虑到代码性能那才是极好的233;

发表评论

电子邮件地址不会被公开。