这次性能测试方案中用到的优化技巧主要基于 Laravel 框架本身及其提供的工具。

关闭应用debugapp.debug=false

缓存配置信息php artisan config:cache

缓存路由信息php artisan router:cache

类映射加载优化php artisan optimize

自动加载优化composer dumpautoload

根据需要只加载必要的中间件

使用即时编译器(JIT),如:HHVM、OPcache

使用 PHP 7.x

除了以上优化技巧之外,还有很多编码上的实践可以提升 Laravel 应用性能,在本文中暂时不会做说明。(也可以关注我的后续文章)

1. 关闭应用 debug

打开应用根目录下的 .env 文件,把 debug 设置为 false。

APP_DEBUG=false

2. 缓存配置信息

php artisan config:cache

运行以上命令可以把 config 文件夹里所有配置信息合并到一个bootstrap/cache/config.php文件中,减少运行时载入文件的数量。

php artisan config:clear

运行以上命令可以清除配置信息的缓存,也就是删除文件

3. 缓存路由信息

php artisan route:cache

运行以上命令会生成文件bootstrap/cache/routes.php。路由缓存可以有效的提高路由器的注册效率,在大型应用程序中效果越加明显。

php artisan route:clear

运行以上命令会清除路由缓存,也就是删除文件。

4. 类映射加载优化

php artisan optimize --force

运行以上命令能够把常用加载的类合并到一个文件中,通过减少文件的加载来提高运行效率。这个命令会生成bootstrap/cache/compiled.php和bootstrap/cache/services.json两个文件。

通过修改config/compile.php文件可以添加要合并的类。

在生产环境中不需要指定--force参数文件也可以自动生成。

php artisan clear-compiled

运行以上命令会清除类映射加载优化,也就是删除

5. 自动加载优化

composer dumpautoload -o

Laravel 应用程序是使用 composer 来构建的。这个命令会把 PSR-0 和 PSR-4 转换为一个类映射表来提高类的加载速度。

注意:php artisan optimize --force命令里已经做了这个操作。

6. 根据需要只加载必要的中间件

Laravel 应用程序内置了并开启了很多的中间件。每一个 Laravel 的请求都会加载相关的中间件、产生各种数据。在app/Http/Kernel.php中注释掉不需要的中间件(如 session 支持)可以极大的提升性能。

7. 使用即时编译器

HHVM 和 OPcache 都能轻轻松松的让你的应用程序在不用做任何修改的情况下,直接提高 50% 或者更高的性能。

8. 使用 PHP 7.x

只能说 PHP 7.x 比起之前的版本在性能上有了极大的提升。

嗯,限于你的真实企业环境,这个也许很长时间内改变不了,算我没说。

0x02 测试方案

我们使用简单的 Apache ab 命令仅对应用入口文件进行测试,并记录和分析数据。

仅对应用的入口文件 index.php 进行测试,访问 “/” 或者 “/index.php” 返回框架的欢迎页面。更全面的性能测试需要针对应用的更多接口进行测试。

使用 Apache ab 命令。ab -t 10 -c 10 {url}。该命令表示对 url 同时发起 10 个请求,并持续 10 秒钟。命令中具体的参数设置需要根据要测试的服务器性能进行选择。

为了避免机器波动导致的数据错误,每种测试条件会执行多次 ab 命令,并记录命令执行结果,重点关注每秒处理的请求数及请求响应时间,分析并剔除异常值。

每次对测试条件进行了调整,需要在浏览器上对欢迎页进行访问,确保没有因为测试条件修改而访问出错。如果页面访问出错会导致测试结果错误。

服务器环境说明

所有脱离具体环境的测试数据都没有意义,并且只有在相近的条件下才可以进行比较。

这套环境运行在 Mac 上,内存 8G,处理器 2.8GHz,SSD 硬盘。

测试服务器是使用 Homestead 搭建的。虚拟机配置为单核 CPU、2G 内存。

服务器 PHP 版本为 7.1,未特殊说明,则标识开启了 OPcache。

测试的 Laravel 应用程序采用 5.2 版本编写。app\Http\routes.php中定义了 85 个路由。

测试过程中除了虚拟机、终端及固定的浏览器窗口外,没有会影响机器的程序运行。

以上的数据,大家在自己进行测试时可以参考。

0x03 测试过程及数据

1. 未做任何优化

1.1 操作

按照以下检查项执行相应的操作。

运行ab -t 10 -c 10 http://myurl.com/index.php

基础检查项

.env 文件中APP_DEBUG=true

不存在bootstrap/cache/config.php

bootstrap/cache/routes.php

bootstrap/cache/compiled.php和bootstrap/cache/services.json

app/Http/Kernel.php中开启了大部分的中间件

浏览器访问 Laravel 应用程序欢迎页确保正常访问

1.2 数据记录

2. 关闭应用debug

2.1 操作

在步骤 1 基础上修改 .env 文件中APP_DEBUG=false。

浏览器访问 Laravel 应用程序欢迎页确保正常访问。

2.2 数据记录

2.3 对比结果

与步骤 1 结果比较发现:关闭应用 debug 之后,每秒处理请求数从 26-34 上升到 33-35,请求响应时间从 大部分 300ms 以上下降到 290ms 左右,效果不太明显,但确实有一定的提升。

注意:这部分与应用中的日志等使用情况有比较大的关联。

3. 开启缓存配置信息

3.1 操作

在步骤 2 基础上,运行php artisan config:cache,确认生成

3.2 数据记录

3.3 对比结果

与步骤 2 结果比较发现:开启配置信息缓存之后,每秒处理请求数从 33-35 上升到 36-38,请求响应时间从 290ms 左右下降到 260ms 左右,

4. 开启缓存路由信息

4.1 操作

在步骤 3 基础上,运行php artisan route:cache

4.2 数据记录

4.3 对比结果

与步骤 3 结果比较发现:开启路由信息缓存之后,每秒处理请求数从 36-38 上升到 60 左右,请求响应时间从 260ms 下降到 160ms 左右,效果显著,从 TPS 看,提升了 70%。

5. 删除不必要的中间件

5.1 操作

在步骤 4 基础上,注释掉不必要的中间件代码。

注意:这次测试中我注释掉了所有的中间件。实际情况中应该尽量只留下必要的中间件。

5.2 数据记录

5.3 对比结果

与步骤 4 结果比较发现:删除了不必要的中间件之后,每秒处理请求数从 60 左右上升到 90 左右,请求响应时间从 160ms 下降到 110ms 左右,效果非常明显,从 TPS 看,提升了 50%。

6. 开启类映射加载优化

6.1 操作

在步骤 5 基础上,运行php artisan optimize --force

6.2 数据记录

6.3 对比结果

与步骤 5 结果比较发现:做了类映射加载优化之后,每秒处理请求数从 90 上升到 110,请求响应时间从 110ms 下降到 100ms 以下,效果还是比较明显的。

7. 关闭 OPcache

7.1 操作

在步骤 6 基础上,关闭 PHP 的 OPcache,并重启服务器。通过 phpinfo() 的 Zend OPcache 确认 OPcache 已经关闭。

7.2 数据记录

7.3 对比结果

与步骤 6 结果比较发现:关闭 OPcache 之后,每秒处理请求数从 110 下降到 15,请求响应时间从 100ms 以下上升到 650ms 以上。开启与关闭 OPcache,数据上竟有几倍的差别。

此后,我重新开启了 PHP 的 OPcache,数据恢复到步骤 6 水平。

0x04 踩过的坑

1. [LogicException] Unable to prepare route [/] for serialization. Uses Closure.

在运行php artisan route:cache命令时报这个错误。

原因:路由文件中处理“/”时使用了闭包的方式。要运行该命令,路由的具体实现不能使用闭包方式。

修改方案:将路由的具体实现放到控制器中来实现。

2. [Exception] Serialization of 'Closure' is not allowed.

原因:路由文件中定义了重复的路由。

修改方案:排查路由文件中的重复路由并修改。尤其要注意resource方法很可能导致与其方法重复。

3. [RuntimeException] Invalid filename provided.

php artisan optimize --force命名时报这个错误。

原因:在加载需要编译的类时没有找到相应的文件。5.2 版本的vendor/laravel/framework/src/Illuminate/Foundation/Console/Optimize/config.php中定义了要编译的文件路径,但不知道为什么/vendor/laravel/framework/src/Illuminate/Database/Eloquent/ActiveRecords.php没有找到,所以报了这个错误。

修改方案:暂时注释掉了以上 config.php 中的../ActiveRecords.php一行。

4. InvalidArgumentException in FileViewFinder.php line 137: View [welcome] not found.

php artisan config:cache之后,浏览器上访问 Laravel 应用程序欢迎页报这个错误。

原因:Laravel 应用程序服务器是通过 Homestead 在虚拟机上搭建的。而这个命令我是在虚拟机之外运行的,导致生成的 config.php 中的路径是本机路径,而不是虚拟机上的路径。所以无法找到视图文件。

修改方案:ssh 到虚拟机内部运行该命令。

0x04 实践技巧

坑也踩了,测试也做过了。这里针对这次经历做个实践技巧的简单总结。

1. 有效的 Laravel 应用程序优化技巧

(包含自动加载优化)

2. 编写代码时注意事项

路由的具体实现放到控制器中。

不定义重复的路由,尤其注意resouce方法。

弄清各中间件的作用,删除不必要的中间件引用。

0x06 下一步

提醒大家:以上的调优技巧及编码注意事项主要针对框架本身,在真正的业务逻辑编码中有很多具体的优化技巧,在此没有讨论。

后续的优化重点将会放在具体编码实践上:

使用 Memcached 来存储会话 config/session.php

使用专业的缓存驱动器

数据库请求优化

为数据集书写缓存逻辑

前端资源合并 Elixir

Laravel应用性能调优的更多相关文章

  1. PHP 性能分析第三篇: 性能调优实战

    注意:本文是我们的 PHP 性能分析系列的第三篇,点此阅读 PHP 性能分析第一篇: XHProf & XHGui 介绍 ,或  PHP 性能分析第二篇: 深入研究 XHGui. 在本系列的 ...

  2. web前端性能调优

    最近2个月一直在做手机端和电视端开发,开发的过程遇到过各种坑.弄到快元旦了,终于把上线了.2个月干下来满满的的辛苦,没有那么忙了自己准备把前端的性能调优总结以下,以方便以后自己再次使用到的时候得于得心 ...

  3. [网站性能2]Asp.net平台下网站性能调优的实战方案

    文章来源:http://www.cnblogs.com/dingjie08/archive/2009/11/10/1599929.html 前言    最近帮朋友运营的平台进行了性能调优,效果还不错, ...

  4. Asp.net平台下网站性能调优的实战方案(转)

    转载地址:http://www.cnblogs.com/chenkai/archive/2009/11/07/1597795.html 前言 最近帮朋友运营的平台进行了性能调优,效果还不错,所以写出来 ...

  5. 第0/24周 SQL Server 性能调优培训引言

    大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤浅,博而不专,到现在我才发现自己的兴趣所在,于 ...

  6. sqlserver性能调优第一步

    相信不少的朋友,无论是做开发.架构的,还是DBA等,都经常听说“调优”这个词.说起“调优”,可能会让很多技术人员心头激情澎湃,也可能会让很多人感觉苦恼,不知道如何入手.当然,也有很多人对此不屑一顾,因 ...

  7. JavaScript:内存泄露、性能调优

    1.在进行JS内存泄露检查之前,先要了解JS的内存管理: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Manageme ...

  8. hadoop 性能调优与运维

    hadoop 性能调优与运维 . 硬件选择 . 操作系统调优与jvm调优 . hadoop运维 硬件选择 1) hadoop运行环境 2)  原则一: 主节点可靠性要好于从节点 原则二:多路多核,高频 ...

  9. JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

    摘要: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat.hprof等小巧的工具,本博客希望 ...

随机推荐

  1. 【Tsinsen-A1486】树(王康宁) 点分治 + Trie

    A1486. 树(王康宁) 时间限制:1.0s   内存限制:512.0MB   总提交次数:455   AC次数:97   平均分:52.62 查看未格式化的试题   提交   试题讨论 试题来源 ...

  2. AMD K7以来核心架构一览表

    转载或拿走使用请注明出处,谢谢! 注:K10以前AMD的CPU型号主要用PR值标称,故此表中未表示其准确型号

  3. DOM操作——JavaScript怎样添加、移除、移动、复制、创建和查找节点

    (1). 创建新节点 createDocumentFragment() // 创建一个DOM片段 createElement() // 创建一个具体的元素 createTextNode() // 创建 ...

  4. 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem K. KMC Attacks 交互题 暴力

    Problem K. KMC Attacks 题目连接: http://codeforces.com/gym/100714 Description Warrant VI is a remote pla ...

  5. Redis使用小结

    Redis官方没有windows版本的,对于Windows环境的redis,有如下两个方案 微软的移植版本,但只支持到3.2 下载地址 win10及以上的版本直接通过win10的liunx子系统执行 ...

  6. 使用Puppeteer进行数据抓取(二)——Page对象

    page对象是puppeteer最常用的对象,它可以认为是chrome的一个tab页,主要的页面操作都是通过它进行的.Google的官方文档详细介绍了page对象的使用,这里我只是简单的小结一下. 客 ...

  7. CRC32 of Ether FCS with STM32

    Everyone knows that STM32F1xx, STM32F2xx, STM32F4xx have a hardware unit with a polynomial CRC32 0x0 ...

  8. 未能加载文件或程序集“System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项

    在发布网站时遇到如题错误. 错误消息详细信息:未能加载文件或程序集“System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=3 ...

  9. [Winform]默认以管理员身份运行程序

    摘要 在使用setupfactory打包之后,想让程序默认以管理员身份运行,因为涉及到创建文件删除文件的操作,如果权限比较低的话,会出现没有权限操作的bug. 解决办法 在项目中找到app.manif ...

  10. VC 中 编译 boost 1.34.1 或者 1.34.0

    c++boost正则表达式的安装方法 (cy163已成功完成实验 基于宽字节 wstring 解决 "南日" 错误 匹配"12日" expression = & ...