核心区别在于php运行时是否跨请求复用:fpm每次请求重建全部环境,worker模式仅启动时初始化一次,后续共享类、配置、opcache及连接实例,显著降低开销、提升并发密度。

核心区别不在“能不能并发”,而在于PHP运行时是否跨请求复用:FPM每次请求都重建整个应用环境;FrankenPHP Worker模式只在启动时初始化一次,后续请求共享已加载的类、配置、OPcache和连接实例。
运行时生命周期完全不同
FPM是“每个请求一个全新PHP进程”:
- 每次请求都要 fork 进程 → 加载扩展 → 初始化 Zend 引擎 → require 所有类 → 解析配置 → 实例化容器 → 执行控制器 → exit 清理全部内存
- 哪怕只是
echo 'OK',Laravel 等框架也要花 30–60ms 做引导 -
$_SERVER、$_GET、$_POST每次都是全新生成
FrankenPHP Worker 是“一个PHP进程持续处理多个请求”:
- 入口脚本(如
public/worker.php)只执行一次,frankenphp_handle_request()调度后续所有请求进入同一进程 - 类定义、OPcache 预加载、APCu 缓存、路由映射表等跨请求有效
-
$_SERVER默认沿用上个请求,需手动重置或调用frankenphp_clear_globals()
连接与资源复用能力差异显著
FPM 中无法真正复用连接:
-
new PDO()或new Redis()每次新建连接,即使开启PDO::ATTR_PERSISTENT,也受限于进程回收策略 - 数据库连接数随并发线性上涨,压测易触发 MySQL 连接池耗尽
- 静态变量、全局对象、单例实例每次请求后都被销毁
Worker 模式支持可控复用:
- PDO/Redis 实例可声明为全局或 static,在进程内跨请求复用(但需自行管理状态,如断连重试)
- 可配合
Swoole\Coroutine\MySQL等异步驱动避免阻塞(需适配) - 需显式清理大数组、关闭显式打开的资源、重置单例缓存(无自动 ResetInterface)
并发模型与资源效率本质不同
FPM 靠多进程实现并发:
- 并发上限由
pm.max_children硬限制 - 每个子进程独占几十 MB 内存,100 个 worker 轻松占用 3–4GB RAM
- 200 并发可能 OOM,进程间完全隔离,无法共享缓存或连接
FrankenPHP Worker 靠协程+单进程实现高密度并发:
- 默认只启 1 个 PHP 工作进程(可通过
FRANKENPHP_WORKERS扩展至 N 个) - 每个进程内用协程跑数百请求,内存增长平缓
- 相同机器上跑 500 并发仍稳定——不是因为“更快”,而是因为“不重复造轮子”
- 协程间可安全共用
static变量、全局连接池
部署与运维方式彻底改变
FPM 依赖完整外部栈:
- 需独立部署 Nginx/Apache + PHP-FPM + FastCGI 协议通信
- 日志分散在
access.log、error.log、slow.log三处 - 调试依赖
/var/log/php-fpm/www-error.log等路径
FrankenPHP 将 Web 服务器与 PHP 运行时融合:
- Caddy 内置 HTTP/2、HTTP/3、自动 HTTPS、静态文件服务,PHP 以常驻 worker 形式嵌入其中
- 所有错误统一输出到标准输出或 Caddy 日志模块,格式一致
- 不再需要 php-fpm.conf、socket 文件、FastCGI 转发配置
-
opcache.enable_cli=1生效(Worker 本质是 CLI 环境),预加载全程可用
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











