FrankenPHP 的架构可以概括为 "Go + Caddy + 嵌入式 PHP" 的混合架构,它彻底改变了传统 PHP-FPM 的多进程模型。以下是核心架构解析:
---
整体架构分层
┌─────────────────────────────────────────────────────────────┐
│ Client Layer │
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────────┐
│ Caddy Core (Go) │
│ • HTTP/1/2/3, TLS, 自动 HTTPS, Early Hints, Brotli/Zstd │
│ • 路由、静态文件、访问日志、Prometheus 指标 │
└──────────────────────┬──────────────────────────────────────┘
│ (CGO 绑定)
┌──────────────────────▼──────────────────────────────────────┐
│ Embedded PHP SAPI │
│ • PHP 解释器直接编译进二进制 (非 FastCGI) │
│ • 共享内存通道与 Caddy 通信 │
└──────────────────────┬──────────────────────┬───────────────┘
│ │
┌───────────▼──────────┐ ┌──────▼───────┐
│ Classic 模式 │ │ Worker 模式 │
│ (PHP-FPM 兼容) │ │ (常驻内存) │
│ • 无状态执行 │ │ • 有状态执行 │
│ • 请求隔离 │ │ • 应用一次启动 │
│ • 每次请求初始化 │ │ • 循环处理请求 │
└────────────────────────┘ └──────────────┘
---
核心技术特点
1. Go-PHP 深度融合
FrankenPHP 不是简单地将 PHP-FPM 和 Nginx 打包在一起,而是通过 CGO 技术 将官方 PHP 解释器直接嵌入 Go 二进制文件:- 消除了 FastCGI 协议的进程间通信开销
- PHP 通过 C 语言 SAPI 与 Go 层直接交互
- 共享内存通道传递请求/响应数据
2. Caddy 作为底层引擎
继承了 Caddy 服务器的所有现代 Web 特性:- 原生 HTTP/2、HTTP/3 (QUIC) 支持
- 自动 HTTPS (Let's Encrypt/ZeroSSL)
- HTTP 103 Early Hints
- Zstandard/Brotli/Gzip 压缩
- 结构化日志与 OpenMetrics/Prometheus 指标
3. 双模式执行架构
| 维度 | Classic 模式 | Worker 模式 |
|---|---|---|
| 执行模型 | 无状态,请求隔离 | 有状态,进程常驻 |
| 生命周期 | 每次请求初始化 | 一次启动,循环处理 |
| 适用场景 | 传统应用,零改造迁移 | 现代框架 (Laravel/Symfony) |
| 性能特征 | 略优于 PHP-FPM | 响应时间减少 80%,吞吐量提升 3-10 倍 |
| 内存管理 | 请求结束即释放 | 需处理内存泄漏,支持 max_requests 重启 |
frankenphp_handle_request($callback) 函数,PHP 脚本在请求处理点暂停,等待 Caddy 传递新请求,而非重新解析整个应用 。---
请求处理流程
Classic 模式:
请求 → Caddy → 创建 PHP 上下文 → 执行 PHP 脚本 → 返回响应 → 销毁上下文
Worker 模式 :
启动 → 初始化应用 (Kernel/DI容器/连接池) →
├─→ 等待请求 ──→ 处理请求 ──→ 返回响应 ──→ (循环) ──┤
└──────────────────────────────────────────────────┘
---
部署架构优势
- 单二进制部署:无需分离 Nginx、PHP-FPM、Supervisor 等组件,单个静态编译文件包含完整运行时
- Go 协程调度:Worker 池由 Go 的 goroutines 管理,支持优雅重启和热重载
- 跨平台:原生支持 Linux、macOS,2025 年 3 月起官方支持 Windows (100% 功能兼容)