站在巨人的肩膀上,通过 Swoole 加速 Laravel/Lumen - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hhxsv5
V2EX    PHP

站在巨人的肩膀上,通过 Swoole 加速 Laravel/Lumen

  •  1
     
  •   hhxsv5 2018-02-05 10:41:58 +08:00 12692 次点击
    这是一个创建于 2812 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:公司严重依赖 Laravel 和 Lumen 框架,显暴露出来了性能问题。

    解决:站在巨人的肩膀上,通过 Swoole 加速 Laravel/Lumen 调研了目前已有的 Laravel+Swoole 结合方案,多多少少都有点儿问题,有的定制化太强,有的没有再维护了。于是决定再造此轮子。

    成果: LaravelS https://github.com/hhxsv5/laravel-s 通过 Swoole 来加速 Laravel/Lumen,常驻内存,内置 HTTP 服务器,平滑 Reload,与 Nginx 配合搭建高可用分布式服务器群,开箱即用。

    目前已经在公司生产环境用起来了,后面考虑加入连接池和协程客户端的封装。

    有需求的可以尝试下,Give me star

    第 1 条附言    2018-02-05 17:57:52 +08:00

    补充下基于Swoole的一些项目

    53 条回复    2018-02-06 10:26:21 +08:00
    hhxsv5
        1
    hhxsv5  
    OP
       2018-02-05 11:15:44 +08:00   1
    CookieQueue 坑已填
    xwsoul
        2
    xwsoul  
       2018-02-05 11:17:04 +08:00
    666 先 Start 一个
    hhxsv5
        3
    hhxsv5  
    OP
       2018-02-05 11:19:19 +08:00
    @xwsoul 谢谢,人多力量大
    lbp0200
        4
    lbp0200  
       2018-02-05 11:20:02 +08:00
    多少并发遇到性能问题?
    hhxsv5
        5
    hhxsv5  
    OP
       2018-02-05 11:27:47 +08:00   1
    @lbp0200 主要是请求的响应时间,fpm 下 laravel 不管再怎么优化,hello world 也要 100 多毫秒;整体并发量不高,每天 pv600w 左右,高峰期也就并发 200 左右,fpm 下压测 laravel 并发就在 300 左右(4 核 8G),但接口的平均响应时长已经超过 1 秒了。
    hhxsv5
        6
    hhxsv5  
    OP
       2018-02-05 11:37:22 +08:00   1
    @lbp0200 laravel 代码一行不改的情况下,用 swoole http server 后,hello world 从 100 多毫秒降到 30 多毫秒,前端再用 nginx 代理下,最多 40 毫秒。
    lyhiving
        7
    lyhiving  
       2018-02-05 11:38:48 +08:00 via Android
    要突破瓶颈 laravel 框架还是要改,router 这个还有很多优化的地方
    hhxsv5
        8
    hhxsv5  
    OP
       2018-02-05 11:43:08 +08:00   1
    @lyhiving 对,特别是路由几百个的,qps 急速下降。
    tabris17
        9
    tabris17  
       2018-02-05 11:46:50 +08:00
    这种奇技淫巧我是不太看好的。要么打补丁,要么有各种限制
    hhxsv5
        10
    hhxsv5  
    OP
       2018-02-05 11:51:02 +08:00   1
    有个小伙伴还做了一次调优的记录 https://segmentfault.com/a/1190000011569012,
    总结下,
    提升明显的几个操作:
    1. 删除多余中间件
    2. 开启类映射加载优化 php artisan optimize --force
    3. 缓存路由 php artisan route:cache
    4. 开启 opcache

    其他的,比如配置缓存,关闭 debug 能做就做。提升一点是一点。
    hhxsv5
        11
    hhxsv5  
    OP
       2018-02-05 11:53:11 +08:00   1
    @tabris17 能抓到耗子的猫就是好猫,像我们公司重度依赖 laravel 的,老项目一堆都是,重写难度太大,老板也不会给那么多时间的。 所以开启新项目前还是得规划好,要是重来的话,可能就是 go 搞服务层,php 搞业务层。
    Outshine
        12
    Outshine  
       2018-02-05 11:54:50 +08:00
    @hhxsv5 hello world 都要 100ms ?为啥我读取了数据库都才 30+ms (版本 5.5,启用了 config:cache 和 route:cache,并开启了 Opcache )
    MeteorCat
        13
    MeteorCat  
       2018-02-05 12:04:42 +08:00 via Android
    问题本身在于 laravel 上,说实话,laravel 在量上来之后那性能真的惨不忍睹,特别是用来做 API 接口服务,总体来说实在太重了
    hhxsv5
        14
    hhxsv5  
    OP
       2018-02-05 12:05:54 +08:00 via Android   1
    @Outshine Laravel 默认情况下测得,没有做任何的优化
    server
        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,如果你要想增加其他的就得想办法了。
    sodowe666
        16
    sodowe666  
       2018-02-05 12:08:56 +08:00   1
    用毛的 laravel yii2 比他强多了
    abusizhishen
        17
    abusizhishen  
       2018-02-05 12:10:56 +08:00 via Android
    先 star 为敬
    eslizn
        18
    eslizn  
       2018-02-05 12:12:57 +08:00
    有遇到 di 的问题吗?之前用 swoole 的时候踩了 call_user_func_array 的坑,印象中 di 是肯定需要这个的
    hhxsv5
        19
    hhxsv5  
    OP
       2018-02-05 12:13:19 +08:00 via Android   1
    @sodowe666 主要是老项目了,重构搞不动
    hhxsv5
        20
    hhxsv5  
    OP
       2018-02-05 12:15:25 +08:00 via Android   1
    @eslizn 要用 Coroutine::call_user_func_array
    eslizn
        21
    eslizn  
       2018-02-05 12:15:55 +08:00
    @server io 倒还好,大不了自己根据协议来封,关键 swoole 改了很多底层的东西,有点不可控。相比 swoole,个人觉得 reactphp 更稳定些。当然 go 更好~~
    eslizn
        22
    eslizn  
       2018-02-05 12:16:38 +08:00
    @hhxsv5 是的,所以看你怎么处理 di 的包
    eslizn
        23
    eslizn  
       2018-02-05 12:18:17 +08:00
    @hhxsv5 错了,只是调用内涉及 [同步 IO] 的操作需要 Coroutine::call_user_func_array,否则还是个大坑,不要问我为什么。。。
    eslizn
        24
    eslizn  
       2018-02-05 12:19:57 +08:00
    @hhxsv5 也就是说,作为框架,你根本不知道什么时候该用 call_user_func_array,什么时候该用 Coroutine::call_user_func_array,我之前也想这样干,后来不了了之
    wanghanlin
        25
    wanghanlin  
       2018-02-05 12:37:42 +08:00
    可以试试 php-pm,基于 reactphp 的
    male110
        26
    male110  
       2018-02-05 12:44:14 +08:00
    来用 C# 吧,.net core
    hhxsv5
        27
    hhxsv5  
    OP
       2018-02-05 12:53:27 +08:00
    @wanghanlin php-pm 不错啊,再结合上 Swoole 的协程客户端
    kslr
        28
    kslr  
       2018-02-05 13:02:57 +08:00
    感觉还是 php-pm 这种侵入性低的方便
    hhxsv5
        29
    hhxsv5  
    OP
       2018-02-05 13:06:44 +08:00   1
    @eslizn 可以用 PHP 动态函数来代替吧,例如$func = "doXxx";$ret = $func("abc"); 不过参数还是有点儿蹩脚。
    hhxsv5
        30
    hhxsv5  
    OP
       2018-02-05 13:11:20 +08:00   2
    @kslr LaravelS 设计的初衷就是低侵入性,composer require=>加 service provider=>改下监听地址=>php artisan run http server=>nginx 代理到此 server。
    eslizn
        31
    eslizn  
       2018-02-05 13:13:04 +08:00
    @hhxsv5 这样的话同步调用就回阻塞整个进程
    hhxsv5
        32
    hhxsv5  
    OP
       2018-02-05 13:15:59 +08:00   1
    @eslizn 呃 call_user_func_array 也是同步的呀
    eslizn
        33
    eslizn  
       2018-02-05 13:17:32 +08:00
    Coroutine:: call_user_func_array 可以将同步 io 挂起,继续去执行其他的协程,关键问题是,在框架中,没办法知道你开发的逻辑中是同步操作还是异步操作
    hhxsv5
        34
    hhxsv5  
    OP
       2018-02-05 13:20:09 +08:00   1
    @eslizn 哦,你说的是 Coroutine 下的。感觉只有程序员自己判断。
    eslizn
        35
    eslizn  
       2018-02-05 13:23:02 +08:00
    @hhxsv5 Laravel 里面大量依赖了 di,而 di 的实现都是要依赖这组函数,所以想了解下你这块是咋处理的,因为看了下源码好像没有涉及 di 的改造
    hhxsv5
        36
    hhxsv5  
    OP
       2018-02-05 13:36:56 +08:00   1
    @eslizn di 那块儿是同步的,没有加入协程的支持。考虑把协程封装暴露出来,开发者显式使用,这样底层才知道什么时候用 Coroutine:: call_user_func_array。
    gouchaoer
        37
    gouchaoer  
       2018-02-05 13:41:31 +08:00   1
    这么说吧,异步的 swoole 中用了同步阻塞函数情况会比 fpm 还要差,因为一旦阻塞当前 swoole worker 进程下别的 request 就得不到执行。。。

    给 lz 推荐一个框架,swoft,这几天会放出 1.0beta 版本,彻底解决问题
    hhxsv5
        38
    hhxsv5  
    OP
       2018-02-05 13:47:38 +08:00   1
    @gouchaoer Swoft 有所了解,有个朋友 xjj 在参与开发。对 LaravelS 的定位其实很低,没有那么高的目标,简单的常驻进程,避免重复的资源加载,再上点儿协程;兼容 Laravel 和 Lumen 的用法。其实这样挺好,基于 Swoole 的百花齐放,让 PHP 开发者有了更多的出路。
    lizhenda
        39
    lizhenda  
       2018-02-05 14:03:49 +08:00
    swoole + yaf + yii 路过~
    wujunze
        40
    wujunze  
       2018-02-05 14:04:15 +08:00
    改善 PHP 生态 赞
    hhxsv5
        41
    hhxsv5  
    OP
       2018-02-05 14:11:38 +08:00   1
    @lizhenda 也可以贡献出来
    server
        42
    server  
       2018-02-05 14:13:35 +08:00
    @lizhenda 这玩法,只能说 丧心病狂
    RorschachZZZ
        43
    RorschachZZZ  
       2018-02-05 14:29:08 +08:00
    除了手册里面那几条优化办法。建议尝试下 php7+opcahce。实测如果数据库没有问题,对 laravel 有巨大的提升
    hhxsv5
        44
    hhxsv5  
    OP
       2018-02-05 14:32:27 +08:00   1
    @RorschachZZZ 对,之前提到的那小伙伴做的调优记录中,opcache 提升是最明显的。
    lyhiving
        45
    lyhiving  
       2018-02-05 15:02:35 +08:00
    @hhxsv5 在生产环境中打开 opcache 是必须的,要不然 laravel 就是一坨屎
    lizhenda
        46
    lizhenda  
       2018-02-05 15:24:31 +08:00
    @server swoole 并发需要它,yaf 简单的路由加上自己魔改下支持命名空间,可以同名控制器; yii2 的 DB 和其它各种模块大家用惯了,所以也加进来了。目前稳定跑了一年多在生产环境,性能看来还是可以的。当然这只是用做 Web 服务,其它服务我们都是用 Go 来写了。
    hhxsv5
        47
    hhxsv5  
    OP
       2018-02-05 15:37:45 +08:00   1
    @lizhenda 微服务这块儿基本是用 go 来写,追求性能。业务层还是 php 在搞,开发效率是杠杠的。
    hhxsv5
        48
    hhxsv5  
    OP
       2018-02-05 17:59:26 +08:00   1
    补充下基于 Swoole 的一些项目,顶部
    wekw
        49
    wekw  
       2018-02-05 18:04:21 +08:00
    试试 Apache ?
    owenliang
        50
    owenliang  
       2018-02-05 18:05:02 +08:00
    开心就好!
    mooncakejs
        51
    mooncakejs  
       2018-02-05 23:56:14 +08:00 via iPhone
    把公司项目换成 nodejs 的路过,响应时间喜滋滋
    ifconfig
        52
    ifconfig  
       2018-02-06 09:54:00 +08:00
    问下楼主,composer 安装和配置好之后,是不是使用 Cooperate with Nginx 那一块,就能使性能大大提高?
    hhxsv5
        53
    hhxsv5  
    OP
       2018-02-06 10:26:21 +08:00   1
    @ifconfig 提速的重点是基于 swoole 的常驻进程,与 nginx 搭配是为了对多服务器做统一的反向代理、负载均衡,提高可用性。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2641 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 10:03 PVG 18:03 LAX 03:03 JFK 06:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86