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

2022-03-15 22:15:19 +08:00
 ywisax

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

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

https://packagist.org/packages/hyperf/framework/stats

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/840608

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX