使用 Workerman 为 Symfony(或其他类似的框架)提速 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ywisax
V2EX    PHP

使用 Workerman 为 Symfony(或其他类似的框架)提速

  •  1
     
  •   ywisax 2022-03-15 22:15:19 +08:00 3914 次点击
    这是一个创建于 1352 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在调研新项目的启动框架,目标开发语言是 PHP ,调研了一些常用的框架和新框架:

    1. Laravel:生态成熟,脚手架什么特别多,启动成本低;
    2. ThinkPHP:多年的偏见很难纠正,但是架不住熟练工多,需要考虑的;
    3. Yii2:个人最喜欢的框架,但是更新节奏太慢了,3.0 估计还得等一两年;
    4. Symfony:现代 PHP 框架的基石,但是要熟练使用较困难;
    5. Hyperf:用的人不多,骂的人不少。但看代码感觉挺好的,特别是 AOP 那部分;
    6. Spiral:RoadRunner 法力加持,开发体验很不错;
    7. Webman:Workerman 作者最近在开发的一个应用框架,开发体验比 Spiral 好一点;

    综合考虑下来(让自己写得舒服点、短时间就自己在开发、可能自己维护个两三年),最终还是决定用 Symfony 了。

    值得一提的是,就上面几个调研的框架来看,fpm 下运行的情况下,Symfony 的响应速度是最快的。按照大众认识,Symfony 应该是最慢的才对。

    虽然 Symfony 很快,但是在 fpm 下依然达不到 golang 吹心中的互联网 CURD Boy 的最低水平,为此我琢磨了下使用 Workerman 来作为 HTTP Server ,从而达到一个更好的性能水平。

    实现路径很简单:

    1. Workerman 实现一个标准的 PSR Request / Response HTTP Server;
    2. Symfony Application 需支持 PSR Request / Response;

    其中 Workerman 在最新版本的 HTTP 服务是已经支持 PSR 的了。 Symfony 方面官方也有维护 symfony/psr-http-message-bridge 。 基于社区资源,我搞了一个 Bundle ,地址是 https://github.com/tourze/workerman-server-bundle

    要体验的话,很简单:

    # symfony-cli 自行安装,大概率是要 FQ ,下面的命令最好也 FQ ,要不就自己改 composer 配置 symfony new --demo symfony0315 # 我目前只测试了 symfony5.4 ,其他版本的话自行解决 cd symfony0315 composer require tourze/workerman-server-bundle -vvv bin/console workerman:http start 

    然后打开 http://127.0.0.1:8080/ 即可体验。在默认开启了 Web Profiler 的情况下,可以做到 10-20ms 的响应。创建配置文件 .env.local 来切换到 production 环境:

    APP_ENV=prod KERNEL_CLASS='App\Kernel' APP_SECRET='$ecretf0rt3st' SYMFONY_DEPRECATIONS_HELPER=999999 PANTHER_APP_ENV=panther PANTHER_ERROR_SCREENSHOT_DIR=./var/error-screenshots DATABASE_URL=sqlite:///%kernel.project_dir%/data/database_test.sqlite MAILER_DSN=smtp://localhost 

    重启服务,此时刷新可以看到基本上可以保证请求在 10ms 内了,达到 phper 最低水准。 不会在 v2 贴图,图片就不放了。

    这个思路同样试用于其他类似的 PHP 框架,只要实现了 PSR 请求规范,都可以通过类似方式来改造。类似的注意点有:

    1. 非 FPM 运行的 PHP 应用,没有 FPM 这种保姆来帮开发自动清理内存了,所以需要认真 review 代码,或者偷懒搞个 maxRequest 机制,处理数量到一定级别就自动退出这个进程(等 Workerman 自动再启动新进程)
    2. MySQL 、Redis 这种外部资源的连接,需要自己做保活;
    3. 不要 die 、不要 exit ,多用 yii2-debug 、symfony web-profiler 这种工具,或者干脆点多 throw Exception ;
    4. 加了 Workerman ,实际最大解决的是文件加载、和初始化对象的开销,如果业务代码很复杂的话,提升效果不明显的;
    20 条回复    2022-04-15 19:20:15 +08:00
    ss098
        1
    ss098  
       2022-03-15 22:39:22 +08:00
    考虑一下 Laravel Octane ?性能一点也不差。
    C603H6r18Q1mSP9N
        2
    C603H6r18Q1mSP9N  
       2022-03-15 22:44:31 +08:00
    赞,赞,赞
    workerman 很强
    我们 tp6+swoole 也很舒服
    Dart
        3
    Dart  
       2022-03-15 23:16:17 +08:00
    不知道你们如何评价一个 web 的性能的。感觉都差不多吧。之前用 Yii1 ,几年前用 phalcon 3/4 。够用难得去换了
    ywisax
        4
    ywisax  
    OP
       2022-03-15 23:16:36 +08:00
    @ss098 Laravel Octane 很早跑过 demo ,那时候还只支持 RoadRunner
    Laravel Octane 针对 Laravel 做得更加多应该是 service 的自动处理,例如 service 的自动 reset 、依赖的清除等等,各个框架如果要兼容非 fpm 运行模式,应该都是做类似的处理。
    因为实际没怎么用过 Laravel ,而且对 swoole 有偏见,所以没怎么考虑。
    ywisax
        5
    ywisax  
    OP
       2022-03-15 23:18:51 +08:00
    @Dart 非大型或突发流量业务,基本上 java 、php 、golang 没啥区别。yii1 当年很优秀
    Dart
        6
    Dart  
       2022-03-15 23:23:18 +08:00
    而且我发现我的应用大部分时间都花在 db 连接查询上了。后来就决定难得换了,降低成本。
    @ywisax yes
    lyhiving
        7
    lyhiving  
       2022-03-16 06:54:52 +08:00 via Android
    Hyperf 应该是国内最优解,laravel 应该是国外最优解
    lizuoqiang
        8
    lizuoqiang  
       2022-03-16 15:49:20 +08:00
    Workerman + SymfOny=> Swoole + Laravel => Hyperf
    ywisax
        9
    ywisax  
    OP
       2022-03-16 20:44:45 +08:00
    @lyhiving Hyperf 从来不是 PHP 开发最优解,跟 swoole 绑死,就已经劝退一大波人,这玩具远不如 Laravel ,国内 TP 也比它好不少。
    Evilk
        10
    Evilk  
       2022-03-16 22:36:12 +08:00
    我们新项目已经全部转战 webman 了
    主要是可以复用 composer 生态
    这点是主因
    ywisax
        11
    ywisax  
    OP
       2022-03-17 00:00:02 +08:00
    @Evilk Webman 的确很厉害,开发体验、性能啥的挑不出明显毛病。
    我唯一顾虑 Webman 的就是没降级到 FPM 的方案。
    Evilk
        12
    Evilk  
       2022-03-17 10:01:52 +08:00
    @ywisax 降级到 fpm? 是什么意思?
    ywisax
        13
    ywisax  
    OP
       2022-03-17 17:17:01 +08:00
    @Evilk 例如某天发现重大问题了,可以切换到 fpm 下继续使用。毕竟 fpm 省心省事多了。
    guanguans
        14
    guanguans  
       2022-03-29 14:30:49 +08:00
    symfony 用 [php-runtime/runtime]( https://github.com/php-runtime/runtime) 就可以了。symfony 已经支持了 [symfony/runtime]( https://github.com/symfony/runtime)。
    limingxinleo
        15
    limingxinleo  
       2022-04-05 20:32:42 +08:00
    @ywisax Hyperf 还能跑在 Swow 环境下,等 Fiber 成熟,还会支持 Fiber
    ywisax
        16
    ywisax  
    OP
       2022-04-06 11:17:53 +08:00
    @limingxinleo hyperf 别能跟 swoole/swow 绑定那么死,还可以玩,现在这样太局限了。
    mrpzx001
        17
    mrpzx001  
       2022-04-14 09:25:39 +08:00
    @ywisax 不用 swoole/swow 为啥要考虑 hyperf ?
    ywisax
        18
    ywisax  
    OP
       2022-04-14 17:04:52 +08:00
    @mrpzx001 我没考虑过 hyperf ,开头只是调研了解了下大家的选择。
    limingxinleo
        19
    limingxinleo  
       2022-04-15 19:19:19 +08:00
    @ywisax Hyperf 是协程框架,现在协程方案只有 Swoole 和 Swow

    等 Fiber 成熟之后,也会考虑 Fiber 的
    limingxinleo
        20
    limingxinleo  
       2022-04-15 19:20:15 +08:00
    Hyperf 现在用的人数也蛮多了

    https://packagist.org/packages/hyperf/framework/stats
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3607 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 21ms UTC 00:49 PVG 08:49 LAX 16:49 JFK 19:49
    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