最近在调研新项目的启动框架,目标开发语言是 PHP ,调研了一些常用的框架和新框架:
- Laravel:生态成熟,脚手架什么特别多,启动成本低;
- ThinkPHP:多年的偏见很难纠正,但是架不住熟练工多,需要考虑的;
- Yii2:个人最喜欢的框架,但是更新节奏太慢了,3.0 估计还得等一两年;
- Symfony:现代 PHP 框架的基石,但是要熟练使用比较困难;
- Hyperf:用的人不多,骂的人不少。但看代码感觉挺好的,特别是 AOP 那部分;
- Spiral:RoadRunner 法力加持,开发体验很不错;
- Webman:Workerman 作者最近在开发的一个应用框架,开发体验比 Spiral 好一点;
综合考虑下来(让自己写得舒服点、短时间就自己在开发、可能自己维护个两三年),最终还是决定用 Symfony 了。
值得一提的是,就上面几个调研的框架来看,fpm 下运行的情况下,Symfony 的响应速度是最快的。按照大众认识,Symfony 应该是最慢的才对。
虽然 Symfony 很快,但是在 fpm 下依然达不到 golang 吹心中的互联网 CURD Boy 的最低水平,为此我琢磨了下使用 Workerman 来作为 HTTP Server ,从而达到一个更好的性能水平。
实现路径很简单:
- Workerman 实现一个标准的 PSR Request / Response HTTP Server;
- 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 请求规范,都可以通过类似方式来改造。类似的注意点有:
- 非 FPM 运行的 PHP 应用,没有 FPM 这种保姆来帮开发自动清理内存了,所以需要认真 review 代码,或者偷懒搞个 maxRequest 机制,处理数量到一定级别就自动退出这个进程(等 Workerman 自动再启动新进程)
- MySQL 、Redis 这种外部资源的连接,需要自己做保活;
- 不要 die 、不要 exit ,多用 yii2-debug 、symfony web-profiler 这种工具,或者干脆点多 throw Exception ;
- 加了 Workerman ,实际最大解决的是文件加载、和初始化对象的开销,如果业务代码很复杂的话,提升效果不明显的;