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

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

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

    最近在调研新项目的启动框架,目标开发语言是 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   ·   实用小工具   ·   2550 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 15:19 · PVG 23:19 · LAX 07:19 · JFK 10:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.