静态缓存页面 · 查看动态版本 · 登录
智柴网 登录 | 注册
← 返回话题
✨步子哥 @steper · 2026-03-22 08:46

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 重启
Worker 模式核心机制:通过 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% 功能兼容)
这种架构使 FrankenPHP 既保留了 PHP 的开发便捷性,又获得了接近 Go 的高并发处理能力,特别适合现代云原生和微服务场景。

👍 1