Laravel 高并发调优笔记

调整框架本身的配置#

  • 编辑.env
    APP_ENV = production
    APP_DEBUG = false
  • php artisan route:cache / php artisan config:cache
  • composer dump-autoload --optimize
  • php artisan optimize

其他可能#

  • 开启 OPcache
  • php-fpm 配置调优

参考文章

But..... 压测很容易看出,这些很难看到提高十倍以上性能的效果#

  • 如果你正在考虑框架性能优化的问题, 你对 PHP 应该已经有足够的了解了。 如你所知, PHP 每次的每次请求结束, 都会释放掉执行中建立的所有资源。这样有一个很大的好处:PHP 程序员基本不用费力去考虑资源释放的问题,诸如内存,IO 句柄,数据库连接等,请求结束时 PHP 将全部释放。PHP 程序员几乎不用关心内存释放的问题,也很难写出内存泄露的程序。这让 PHP 变得更加简单容易上手, 直抒心意。但是也带来了一个坏处:PHP 很难在请求间复用资源, 类似 PHP 框架这种耗时的工作, 每次请求都需要反复做 —— 即使每次都在做同样的事情。也正因为如此,在 PHP 发展过程中,关于是否使用框架的争论也从未停止过。

  • Laravel 本身启动需要的文件就很多,外加其出了名的生态环境好,开发中我们会 很多很多现有的轮子,使得一次启动的磁盘 IO 特别高(就是要加载很多文件嘛),虽然官方的 php artisan optimize 方法优化了文件的加载,但并没有实际解决 IO 上的问题。
    知道了问题那就很容易解决了,只要不要每次启动都重新加载就好了,下面轮到 Swoole 上场啦。

  • swoole 框架相比 apache/fpm,主要是节省 PHP 框架和全局对象每次请求创建销毁带来的性能损耗。如果你的 PHP 代码是裸 echo 的方式,swoole 框架并没有性能优势。

  • 同样,事情总是有好有坏。坏处是:PHP 编程变得更难了, 你需要考虑内存的释放,需要关心 PHP 如何使用内存。甚至, 你需要了解使用的框架,以免『不小心』写出让人『惊喜』的效果。同时, PHP 的调试变得更难, 因为每次修改程序后需要重启进程才能看到效果。好处是:程序的性能得到极大的提高。 当然, 客观上的一些利好因素是: PHP 的内存回收已经相当稳定和高效, Swoole 稳定性已经在相当多的项目中得到验证,Laravel 代码质量相当高

画个饼#

方案性能对比 使用的轮子:stone

应用类型 原始 Laravel Stone-Web Stone-Server 原生 php 直接 echo
laravel5 默认页面 150 3000 -- --
laravel5 简单接口 150 3000 8500 9500
laravel4 实际项目简单页面 70 1000 -- --
laravel4 简单接口 120 -- 8200 9500
laravel4 实际项目首页 35 380 -- --
  • 以上单位全部为 RPS
  • Stone 相对于原始的 Laravel 有相当可观的提升
  • 即使和一个简单的 echo 相比, Stone 性能损失仅 10% 左右

swoole+laravel 说干就干!#

PS:如果亲还是用的 php5 我就不带你玩了哈

选个新点火点的轮子:laravel-s

找个本地已有项目 ab 试水,附上现有结果

Requests per second: 31.91 [#/sec]

先看 laravel-s 文档一阵配置....

Requests per second: 592.17 [#/sec] (mean)

都是压测的 ab -n 200 -c 20 三次取的平均值 性能提升了 20 倍!!!

不必多说 花 10 分钟你也来试试 就知道其中的爽了

bingo, 终于可以在 golang 的同事面前继续说 php 是世界上最美的语言了.......

最后再吹水一波 swoole#

使用 apache bench 工具对 Nginx 静态页、Golang Http 程序、PHP7+Swoole Http 程序进行压力测试。在同一台机器上,进行并发 100 共 100 万次 Http 请求的基准测试中,QPS 对比如下:

软件 QPS 软件版本
Nginx 164489.92 nginx/1.4.6 (Ubuntu)
Golang 166838.68 go version go1.5.2 linux/amd64
PHP7+Swoole 287104.12 swoole-1.7.22-alpha
Nginx-1.9.9 245058.70 nginx/1.9.9

From swoole 官网 去看看

本文转自 dynamohuang.github.io,转发请标注来源

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 7年前 加精
dynamohuang
讨论数量: 12

看来 php7+laravel+swoole 将会成为趋势

7年前 评论

不错不错,go 写 api, laravel 做后台管理。

7年前 评论

看来 php7+laravel+swoole 将会成为趋势

7年前 评论

不错不错,go 写 api, laravel 做后台管理。

7年前 评论

大多数公司后期都会换成 Java 来做,无论怎么优化,实际上还是赶不上静态的速度。我的意思,还是合理的工具用在合理的地方。

7年前 评论

我倒是觉得换成 Java 的原因并不是因为速度,而是因为规范性。

PHP 太随意了,业务成熟一点就升 Java 。

7年前 评论

@itfanr 是的,个人意见,认为他随意。

7年前 评论
幽弥狂

@itfanr 我也觉得太随意 规范定了也没卵用,毕竟人家已经几年的习惯不是说改就改的

7年前 评论
幽弥狂

如果亲还是用的 php5 我就不带你玩了哈

公司有些同事不喜欢我推荐的 php7.1 说 5.6 就很好

7年前 评论

为啥比 nginx 静态页 QPS 还高,这是什么道理?

7年前 评论
DukeAnn

@qufo 那我觉得 Go 才是最随性的语言,全是隐式继承和实现。基本上是原子组合无任何限制

7年前 评论

@ADKi 我们所指的 随意 不是同一个东西,比如,我把 $username $userName $UserName `$user_name $User_name $User_Name 称为随意,你看,其实都有规则,并不是真随意。
但是 var Usernamevar username 就不随意了。
PHP 里前一步 $data = false 后一步 $data = [] 了。可恨的是,return empty($data)?false:$data , 他有可能是数组也有可能是 bool 。
并且,好多 PHPer 都这么用,并且不以为然。认为这才是正确的。

6年前 评论

研发经理 @ HRG
文章
1
粉丝
21
喜欢
109
收藏
24
排名:358
访问:2.7 万
私信
所有博文
社区赞助商