背景:公司严重依赖 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 ![]() 用毛的 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 ![]() 这么说吧,异步的 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 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 那一块,就能使性能大大提高? |