Laravel 项目加速指南

很多人都说用 Laravel 做开发很好但是性能太差,我曾经也一度这么认为,最近围绕 composer 做一些行项目 ,研究了 composer 的自动加载机制,顺便研究了下 Laravel 项目,发现,事实上 Laravel 并不慢,只不过还是我们没有用好它罢了。

PHP 项目慢的几个重要原因

首先想到的导致 PHP 项目慢的一个首要原因就是 IO 问题, 因为php是解释型语言,所以每次请求都要读取源代码并进行语法解析,解决这个问题要从两方面下手:

  • 一是将解析过的文件的结果都缓存起来,下次直接读取,这方面目前已经有了非常成熟的方案,比如 Xcache, Opcache 等,选择官方的 Opcache就好, 你会发现只要开了 Opcache 并且配置得当, 程序性能马上提升 10 倍是不成问题的
  • 其次是减少文件不必要的文件引入,现在大家都用 composer 组织项目,往往会引入很多不必要的类库,导致项目变的臃肿。

基本上解决了 IO 问题, PHP 项目性能就会有极大的提升, 因为大多数 PHP 项目都不是计算密集型项目,CPU并不会成为它的性能瓶颈。

针对 Laravel 项目的加速

优化一:关闭debug

打开.env文件,把debug设置为false。

APP_ENV=local

APP_DEBUG=false

APP_KEY=base64:sT/aTFeaE13eyao1Raee6jC9Ff+Yle1SE+wtyk0H6B4=

 

 优化二:缓存路由和配置

每次服务器执行请求时,都会注册所有的路由,这会花费一些时间。但是,你可以选择缓存路由列表来跳过这个步骤。
缓存路由列表是非常简单的。你需要做的是在部署应用程序后,执行下面的这个命令:

php artisan route:cache

但是,如果你添加或修改了任意一个路由信息,请不要忘记清除之前的缓存以及重新执行缓存命令。

php artisan route:clear
php artisan route:cache

注意,这只对控制器类路由有效。
缓存配置
就如路由一样,你同样可以在应用中缓存配置文件。
设想一下这种场景:每次你发送一个请求到 App 中,Laravel 都需要去加载不同的配置文件,并且要去打开*.env* 文件读取其中的内容。这种方式性能低下,是不?
不过不用担心,这里有个 Artisan 命令专治这个。

php artisan config:cache

你在部署之后可以使用它。和路由差不多,别忘了编辑东西的时候清理一下缓存。

php artisan config:clear
php artisan config:cache

优化三:composer优化

sudo composer dump-autoload optimize

优化四:laravel 提升性能命令

php artisan optimize

优化五:使用性能更好的Cache和Session驱动

Laravel默认是有缓存的,当你新建一个 Laravel 项目的时候Cache 和 Sessions 的驱动默认为 「文件」。在本地开发环境和小项目中它没啥问题,但是项目增长时,就显得不够用了。
所以,考虑下换个更好的驱动例如 Redis。 Laravel 有内置支持它的方式,而你要做的就是 安装 Predis。

优化五:使用队列

有些时候,Laravel 比预期慢,这时你可以考虑异步执行任务。
最常见的情况就是发送一封欢迎邮件,让我们一起看看任务流程。

用户填写我们的表单;
将他/她的详细信息写入数据库;
发送一封写有欢迎语和确认链接的邮件给他/她;
并展示感谢页面;

很多时候,这些任务完全是在控制器中并且按照顺序执行。
我的建议是学会如何使用事件和队列,可以将发送邮件任务交给专门的流程,以致于改善用户使用体验。
我上篇文章专门讲了laravel队列的使用,有兴趣的可以去看一下Laravel队列的使用。

优化六:删除未使用的服务

Laravel 自带了很多服务,它是一个全栈框架,每一个服务都有其用武之地。
所以,请花一些时间检查 *config/app.php * 文件,看看你是否能找到一个你不需要的服务。如果一切正常,请尝试将其删除并测试您的应用程序。
它应该有所帮助(一点点)!

优化七: 使用预加载进行查询

如果你知道 Laravel 是什么,你可能也知道预加载是什么。 如果您信息不够及时,预加载是一种通过使用特定语法来减少发送到数据库的查询数量来提高 Eloquent 性能的方法。
更改基础查询以避免此性能问题。 您将只执行两个查询而不是1001! 这是巨大的性能提升。

优化八:缓存查询结果

有时候, 缓存一个具体的查询结果可能是一个好主意。
想象这样一个场景:你准备在你的应用主页上展示 排行榜。 这项工作是通过从数据库中执行查询完成的(查询可能涉及到artists表以及其他的一些表)。 你的主页访问量是 1000 次/小时 。
如果这个排行榜数据的查询次数是 1000次每小时,那么一天下来执行的查询次数就是24000次。
现在,让我们假设这个排行榜是每小时更新一次 。那么,将每次的查询结果缓存一小时如何 ?
这个缓存组件的 * remember* 方法在未找到缓存的情况下将会先从数据库中获取数据,并缓存60分钟。到期后,将会再次从数据库中获取最新的数据,更新缓存。
查询次数 从 24000 到 24 次/天 。

优化九: 数据表要建立索引

记住,必要的时候请为您的数据表建立索引。 这看起来像是个没什么卵用的提示,但实际上这很有必要。 因为我见过非常多的应用,它们的数据表没有索引。
实现起来很简单,您可以创建一个新的数据库迁移并使用里面的方法来添加索引.
当然,索引不是您喜欢在哪建就直接创建一个就是了。您必须研究您的业务、代码和查询,去分析哪里才是最需要索引的地方,然后再建立索引。

优化十:去除没必要的中间件

Laravel 会对你注册的中间件进行大量的(前/后)调用。所以,请你仔细检查它们,并且去掉那些你不需要的中间件。
通常中间件列表在 *Kernel.php *。

优化十一:使用更高版本的php并开启OpCacahe

这不仅仅是针对Laravel网站的性能优化方法,其中很多也是通用的网站性能优化的方法;

优化十二:使用CDN

肯定会有很多前端的资源,比如 CSS 文件和 JS 脚本。
你可以通过多种方式来减少发送给用户的数据量:

    压缩静态资源;
    捆绑静态资源(将多个 CSS 文件或者 JS 脚本合并为一个,以减少请求次数);
    开启 gzip 压缩;

然而,如果你遇到大量的流量,我建议你可以将你的静态资源托管到专用的 CDN 服务器上,比如七牛等
 

优化十三:开启 Opcache

这一条对所有 PHP 项目都适用, 很人多说自己已经开启了 Opcache, 事实上往往没有,因为 Opache 是否已经开启是肉眼不可见的, 所以可以使用如下命令确认:

php -r "var_dump(function_exists('opcache_get_status'));"

如果返回 bool(true) 则说明 Opacahe 已经安装成功了

开启Opcache 是最重要的一环。

 

结尾

结论,Laravel 项目优化主要还是两点:一是开启opcache, 二是减少文件引入, 减少文件引入的方法这里提供的可能并不全面,可以自己去研究,我的研究发现,当Laravel 某个接口 的引入文件达到 26 时,并发量可以达到 6k 左右。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章