这是一份过后的总结。在经历了调优过程踩的不少坑以后,咱们最终完善并实施了初步的性能测试方案,经过真实的测试数据概括出了 Laravel 开发过程当中的一些实践技巧。php
最近有同事反馈 Laravel 写的应用程序响应有点慢、20几个并发把 CPU 跑满... 为了解决慢的问题,甚至一部分接口用 nodejs 来写。前端
而个人第一反应是一个流行的框架怎么可能会有这么不堪?必定是使用上哪里出现了问题。为了一探究竟,因而开启了此次 Laravel 应用性能调优之旅。node
此次性能测试方案中用到的优化技巧主要基于 Laravel 框架自己及其提供的工具。laravel
app.debug=false
php artisan config:cache
php artisan router:cache
php artisan optimize
composer dumpautoload
除了以上优化技巧以外,还有不少编码上的实践能够提高 Laravel 应用性能,在本文中暂时不会作说明。(也能够关注个人后续文章)数据库
打开应用根目录下的 .env 文件,把 debug 设置为 false。json
APP_DEBUG=false
php artisan config:cache
运行以上命令能够把 config 文件夹里全部配置信息合并到一个 bootstrap/cache/config.php
文件中,减小运行时载入文件的数量。bootstrap
php artisan config:clear
运行以上命令能够清除配置信息的缓存,也就是删除 bootstrap/cache/config.php
文件浏览器
php artisan route:cache
运行以上命令会生成文件 bootstrap/cache/routes.php
。路由缓存能够有效的提升路由器的注册效率,在大型应用程序中效果越加明显。缓存
php artisan route:clear
运行以上命令会清除路由缓存,也就是删除 bootstrap/cache/routes.php
文件。服务器
php artisan optimize --force
运行以上命令可以把经常使用加载的类合并到一个文件中,经过减小文件的加载来提升运行效率。这个命令会生成 bootstrap/cache/compiled.php
和 bootstrap/cache/services.json
两个文件。
经过修改 config/compile.php
文件能够添加要合并的类。
在生产环境中不须要指定 --force
参数文件也能够自动生成。
php artisan clear-compiled
运行以上命令会清除类映射加载优化,也就是删除 bootstrap/cache/compiled.php
和 bootstrap/cache/services.json
两个文件。
composer dumpautoload -o
Laravel 应用程序是使用 composer 来构建的。这个命令会把 PSR-0 和 PSR-4 转换为一个类映射表来提升类的加载速度。
注意:
php artisan optimize --force
命令里已经作了这个操做。
Laravel 应用程序内置了并开启了不少的中间件。每个 Laravel 的请求都会加载相关的中间件、产生各类数据。在 app/Http/Kernel.php
中注释掉不须要的中间件(如 session 支持)能够极大的提高性能。
HHVM 和 OPcache 都能轻轻松松的让你的应用程序在不用作任何修改的状况下,直接提升 50% 或者更高的性能。
只能说 PHP 7.x 比起以前的版本在性能上有了极大的提高。
嗯,限于你的真实企业环境,这个也许很长时间内改变不了,算我没说。
咱们使用简单的 Apache ab 命令仅对应用入口文件进行测试,并记录和分析数据。
ab -t 10 -c 10 {url}
。该命令表示对 url 同时发起 10 个请求,并持续 10 秒钟。命令中具体的参数设置须要根据要测试的服务器性能进行选择。服务器环境说明
全部脱离具体环境的测试数据都没有意义,而且只有在相近的条件下才能够进行比较。
app\Http\routes.php
中定义了 85 个路由。以上的数据,你们在本身进行测试时能够参考。
ab -t 10 -c 10 http://myurl.com/index.php
基础检查项
APP_DEBUG=true
bootstrap/cache/config.php
bootstrap/cache/routes.php
bootstrap/cache/compiled.php
和 bootstrap/cache/services.json
app/Http/Kernel.php
中开启了大部分的中间件APP_DEBUG=false
。ab -t 10 -c 10 http://myurl.com/index.php
。与步骤 1 结果比较发现:关闭应用 debug 以后,每秒处理请求数从 26-34 上升到 33-35,请求响应时间从 大部分 300ms 以上降低到 290ms 左右,效果不太明显,但确实有必定的提高。
注意:这部分与应用中的日志等使用状况有比较大的关联。
php artisan config:cache
,确认生成 bootstrap/cache/config.php
。ab -t 10 -c 10 http://myurl.com/index.php
。与步骤 2 结果比较发现:开启配置信息缓存以后,每秒处理请求数从 33-35 上升到 36-38,请求响应时间从 290ms 左右降低到 260ms 左右,效果不太明显,但确实有必定的提高。
php artisan route:cache
,确认生成 bootstrap/cache/routes.php
。ab -t 10 -c 10 http://myurl.com/index.php
。与步骤 3 结果比较发现:开启路由信息缓存以后,每秒处理请求数从 36-38 上升到 60 左右,请求响应时间从 260ms 降低到 160ms 左右,效果显著,从 TPS 看,提高了 70%。
ab -t 10 -c 10 http://myurl.com/index.php
。注意:此次测试中我注释掉了全部的中间件。实际状况中应该尽可能只留下必要的中间件。
与步骤 4 结果比较发现:删除了没必要要的中间件以后,每秒处理请求数从 60 左右上升到 90 左右,请求响应时间从 160ms 降低到 110ms 左右,效果很是明显,从 TPS 看,提高了 50%。
php artisan optimize --force
,确认生成 bootstrap/cache/compiled.php
和 bootstrap/cache/services.json
。ab -t 10 -c 10 http://myurl.com/index.php
。与步骤 5 结果比较发现:作了类映射加载优化以后,每秒处理请求数从 90 上升到 110,请求响应时间从 110ms 降低到 100ms 如下,效果仍是比较明显的。
ab -t 10 -c 10 http://myurl.com/index.php
。与步骤 6 结果比较发现:关闭 OPcache 以后,每秒处理请求数从 110 降低到 15,请求响应时间从 100ms 如下上升到 650ms 以上。开启与关闭 OPcache,数据上竟有几倍的差异。
此后,我从新开启了 PHP 的 OPcache,数据恢复到步骤 6 水平。
在运行 php artisan route:cache
命令时报这个错误。
缘由:路由文件中处理“/”时使用了闭包的方式。要运行该命令,路由的具体实现不能使用闭包方式。
修改方案:将路由的具体实现放到控制器中来实现。
在运行 php artisan route:cache
命令时报这个错误。
缘由:路由文件中定义了重复的路由。
修改方案:排查路由文件中的重复路由并修改。尤为要注意 resource
方法极可能致使与其方法重复。
在运行 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
一行。
在运行 php artisan config:cache
以后,浏览器上访问 Laravel 应用程序欢迎页报这个错误。
缘由:Laravel 应用程序服务器是经过 Homestead 在虚拟机上搭建的。而这个命令我是在虚拟机以外运行的,致使生成的 config.php 中的路径是本机路径,而不是虚拟机上的路径。因此没法找到视图文件。
修改方案:ssh 到虚拟机内部运行该命令。
坑也踩了,测试也作过了。这里针对此次经历作个实践技巧的简单总结。
app.debug=false
php artisan config:cache
php artisan router:cache
php artisan optimize
(包含自动加载优化 composer dumpautoload
)resouce
方法。以上的调优技巧及编码注意事项主要针对框架自己,在真正的业务逻辑编码中有不少具体的优化技巧,在此没有讨论。
后续的优化重点将会放在具体编码实践上:
网上看到不少框架性能对比的文章与争论,也看到不少简单贴出了数据。这些都不足以窥探真实的状况,因此有了咱们此次的实践,并在过程当中作了详实的记录。在各位读者实践过程当中提供参考、比较、反思之用。对于此次实践有疑问的读者,也欢迎提出问题和意见。
很少说了,要学习更多技术干货,请关注微信公众号:up2048。
- EOF -