背景:公司严重依赖 Laravel 和 Lumen 框架,显暴露出来了性能问题。
解决:站在巨人的肩膀上,通过 Swoole 加速 Laravel/Lumen 调研了目前已有的 Laravel+Swoole 结合方案,多多少少都有点儿问题,有的定制化太强,有的没有再维护了。于是决定再造此轮子。
成果: LaravelS https://github.com/hhxsv5/laravel-s 通过 Swoole 来加速 Laravel/Lumen,常驻内存,内置 HTTP 服务器,平滑 Reload,与 Nginx 配合搭建高可用分布式服务器群,开箱即用。
目前已经在公司生产环境用起来了,后面考虑加入连接池和协程客户端的封装。
有需求的可以尝试下,Give me star
1
hhxsv5 OP CookieQueue 坑已填
|
2
xwsoul 2018-02-05 11:17:04 +08:00
666 先 Start 一个
|
4
lbp0200 2018-02-05 11:20:02 +08:00
多少并发遇到性能问题?
|
5
hhxsv5 OP @lbp0200 主要是请求的响应时间,fpm 下 laravel 不管再怎么优化,hello world 也要 100 多毫秒;整体并发量不高,每天 pv600w 左右,高峰期也就并发 200 左右,fpm 下压测 laravel 并发就在 300 左右(4 核 8G),但接口的平均响应时长已经超过 1 秒了。
|
6
hhxsv5 OP @lbp0200 laravel 代码一行不改的情况下,用 swoole http server 后,hello world 从 100 多毫秒降到 30 多毫秒,前端再用 nginx 代理下,最多 40 毫秒。
|
7
lyhiving 2018-02-05 11:38:48 +08:00 via Android
要突破瓶颈 laravel 框架还是要改,router 这个还有很多优化的地方
|
9
tabris17 2018-02-05 11:46:50 +08:00
这种奇技淫巧我是不太看好的。要么打补丁,要么有各种限制
|
10
hhxsv5 OP 有个小伙伴还做了一次调优的记录 https://segmentfault.com/a/1190000011569012,
总结下, 提升明显的几个操作: 1. 删除多余中间件 2. 开启类映射加载优化 php artisan optimize --force 3. 缓存路由 php artisan route:cache 4. 开启 opcache 其他的,比如配置缓存,关闭 debug 能做就做。提升一点是一点。 |
11
hhxsv5 OP @tabris17 😆 能抓到耗子的猫就是好猫,像我们公司重度依赖 laravel 的,老项目一堆都是,重写难度太大,老板也不会给那么多时间的。 所以开启新项目前还是得规划好,要是重来的话,可能就是 go 搞服务层,php 搞业务层。
|
12
Outshine 2018-02-05 11:54:50 +08:00
@hhxsv5 hello world 都要 100ms ?为啥我读取了数据库都才 30+ms (版本 5.5,启用了 config:cache 和 route:cache,并开启了 Opcache )
|
13
MeteorCat 2018-02-05 12:04:42 +08:00 via Android
问题本身在于 laravel 上,说实话,laravel 在量上来之后那性能真的惨不忍睹,特别是用来做 API 接口服务,总体来说实在太重了
|
15
server 2018-02-05 12:08:27 +08:00
先来波👍。真的要性能还是选择 go。swoole 快在于异步,php 得加 yield,不然一个 file_put_contents 直接凉凉。
swoole 2+ 支持协程,官方也有 redis mysql https://wiki.swoole.com/wiki/page/749.html,如果你要想增加其他的就得想办法了。 |
16
sodowe666 2018-02-05 12:08:56 +08:00 1
用毛的 laravel yii2 比他强多了
|
17
abusizhishen 2018-02-05 12:10:56 +08:00 via Android
先 star 为敬
|
18
eslizn 2018-02-05 12:12:57 +08:00
有遇到 di 的问题吗?之前用 swoole 的时候踩了 call_user_func_array 的坑,印象中 di 是肯定需要这个的
|
21
eslizn 2018-02-05 12:15:55 +08:00
@server io 倒还好,大不了自己根据协议来封,关键 swoole 改了很多底层的东西,有点不可控。相比 swoole,个人觉得 reactphp 更稳定些。当然 go 更好~~
|
23
eslizn 2018-02-05 12:18:17 +08:00
@hhxsv5 错了,只是调用内涉及 [同步 IO] 的操作需要 Coroutine::call_user_func_array,否则还是个大坑,不要问我为什么。。。
|
24
eslizn 2018-02-05 12:19:57 +08:00
@hhxsv5 也就是说,作为框架,你根本不知道什么时候该用 call_user_func_array,什么时候该用 Coroutine::call_user_func_array,我之前也想这样干,后来不了了之
|
25
wanghanlin 2018-02-05 12:37:42 +08:00
可以试试 php-pm,基于 reactphp 的
|
26
male110 2018-02-05 12:44:14 +08:00
来用 C# 吧,.net core
|
27
hhxsv5 OP @wanghanlin php-pm 不错啊,再结合上 Swoole 的协程客户端
|
28
kslr 2018-02-05 13:02:57 +08:00
感觉还是 php-pm 这种侵入性低的方便
|
29
hhxsv5 OP @eslizn 可以用 PHP 动态函数来代替吧,例如$func = "doXxx";$ret = $func("abc"); 不过参数还是有点儿蹩脚。
|
30
hhxsv5 OP @kslr LaravelS 设计的初衷就是低侵入性,composer require=>加 service provider=>改下监听地址=>php artisan run http server=>nginx 代理到此 server。
|
33
eslizn 2018-02-05 13:17:32 +08:00
Coroutine:: call_user_func_array 可以将同步 io 挂起,继续去执行其他的协程,关键问题是,在框架中,没办法知道你开发的逻辑中是同步操作还是异步操作
|
35
eslizn 2018-02-05 13:23:02 +08:00
@hhxsv5 Laravel 里面大量依赖了 di,而 di 的实现都是要依赖这组函数,所以想了解下你这块是咋处理的,因为看了下源码好像没有涉及 di 的改造
|
36
hhxsv5 OP @eslizn di 那块儿是同步的,没有加入协程的支持。考虑把协程封装暴露出来,开发者显式使用,这样底层才知道什么时候用 Coroutine:: call_user_func_array。
|
37
gouchaoer 2018-02-05 13:41:31 +08:00 1
这么说吧,异步的 swoole 中用了同步阻塞函数情况会比 fpm 还要差,因为一旦阻塞当前 swoole worker 进程下别的 request 就得不到执行。。。
给 lz 推荐一个框架,swoft,这几天会放出 1.0beta 版本,彻底解决问题 |
38
hhxsv5 OP @gouchaoer Swoft 有所了解,有个朋友 xjj 在参与开发。对 LaravelS 的定位其实很低,没有那么高的目标,简单的常驻进程,避免重复的资源加载,再上点儿协程;兼容 Laravel 和 Lumen 的用法。其实这样挺好,基于 Swoole 的百花齐放,让 PHP 开发者有了更多的出路。
|
39
lizhenda 2018-02-05 14:03:49 +08:00
swoole + yaf + yii 路过~
|
40
wujunze 2018-02-05 14:04:15 +08:00
改善 PHP 生态 赞
|
43
RorschachZZZ 2018-02-05 14:29:08 +08:00
除了手册里面那几条优化办法。建议尝试下 php7+opcahce。实测如果数据库没有问题,对 laravel 有巨大的提升
|
44
hhxsv5 OP @RorschachZZZ 对,之前提到的那小伙伴做的调优记录中,opcache 提升是最明显的。
|
46
lizhenda 2018-02-05 15:24:31 +08:00
@server swoole 并发需要它,yaf 简单的路由加上自己魔改下支持命名空间,可以同名控制器; yii2 的 DB 和其它各种模块大家用惯了,所以也加进来了。目前稳定跑了一年多在生产环境,性能看来还是可以的。当然这只是用做 Web 服务,其它服务我们都是用 Go 来写了。
|
48
hhxsv5 OP 补充下基于 Swoole 的一些项目,顶部⬆
|
49
wekw 2018-02-05 18:04:21 +08:00
试试 Apache ?
|
50
owenliang 2018-02-05 18:05:02 +08:00
开心就好!
|
51
mooncakejs 2018-02-05 23:56:14 +08:00 via iPhone
把公司项目换成 nodejs 的路过,响应时间喜滋滋
|
52
ifconfig 2018-02-06 09:54:00 +08:00
问下楼主,composer 安装和配置好之后,是不是使用 Cooperate with Nginx 那一块,就能使性能大大提高?
|