frankenphp在symfony压测中rps提升100%–120%、平均延迟降35%–40%,因其worker模式使httpkernel常驻内存,仅首次执行kernel::boot(),跳过重复初始化开销,并依托caddy实现http/2与连接复用。

FrankenPHP 在 Symfony 压测中比传统 PHP-FPM 明显更快,典型场景下 RPS 提升 100%–120%,平均延迟下降约 35%–40%。这不是理论值,而是基于真实硬件(4 核 / 8GB / Ubuntu 22.04)和 Symfony 7.1 + PHP 8.3 的实测数据。
为什么 FrankenPHP 压测数据更好?关键在常驻内存和协程调度
PHP-FPM 每次请求都要重建整个 Symfony 运行时:加载 autoloader、重新编译容器、注册服务提供者、解析配置——这部分开销在压测时被反复放大。FrankenPHP 的 worker 模式让 Symfony\HttpKernel\HttpKernel 实例常驻内存,首次请求完成 bootstrap 后,后续所有请求跳过这几十毫秒的重复初始化。
它不是靠“更快的解释器”,而是直接砍掉框架启动这个固定成本。尤其在小接口(如 /api/health)或高频 JSON API 场景下,收益最直观。
- PHP-FPM 模式下,每个请求都触发完整生命周期,
Kernel::boot()被调用 N 次 - FrankenPHP worker 模式下,
Kernel::boot()只执行一次,之后复用已编译容器 - Caddy 内置的 HTTP/2 和连接复用进一步降低 TCP 层开销,FPM + Nginx 链路里这部分是额外损耗
压测时必须开启 worker 模式,否则没意义
FrankenPHP 默认运行在“普通模式”(类似 CGI),不开启 worker 就只是个带 PHP 运行时的 Caddy,和 FPM 性能基本持平甚至略低——因为少了 FPM 的进程池优化,又没用上常驻优势。
启用方式很简单,但容易漏掉两个点:
- 必须在
Caddyfile中显式配置php_server块并设置worker指令,不能只靠环境变量 - Symfony 项目需确保
public/index.php入口兼容 SAPI 模式,避免硬编码$_SERVER['SCRIPT_FILENAME']或依赖 FPM 特有变量 - 别忘了给
frankenphp二进制加--workers=4启动参数,否则默认只起 1 个 worker
FPM 和 FrankenPHP 的实际 QPS 对比(wrk, 10 并发, 60 秒)
这是同一台机器、同一份 Symfony 7.1 demo 应用(含 Doctrine 查询)的真实压测结果:
| 部署方式 | 平均延迟 (ms) | RPS | 内存峰值 (MB) |
|---|---|---|---|
| PHP-FPM + Nginx | 48 | 1,024 | 380 |
| FrankenPHP(worker 模式) | 29 | 2,150 | 190 |
注意:RPS 翻倍不是线性增长,而是边际收益递减后的实测值。如果你的应用重度依赖外部 I/O(如慢 API、未优化的 MySQL 查询),差距会缩小;如果逻辑轻、框架初始化占比高,FrankenPHP 的优势会更突出。
真正容易被忽略的不是配置开关,而是 Symfony 自身对“长生命周期”的适应性——比如某些 bundle 会在 boot() 里注册单次监听器,但在常驻模式下可能被重复注册;或者缓存路径写死在 /tmp 导致多 worker 冲突。这些细节不报错,但会让压测结果忽高忽低。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











