V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hhxsv5
V2EX  ›  PHP

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

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

    背景:公司严重依赖 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   ·   实用小工具   ·   4931 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 09:43 · PVG 17:43 · LAX 01:43 · JFK 04:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.