frankenphp没有pm.max_children,其基于go协程的worker模型用max_workers替代,需按内存、i/o和超时综合配置,并注意代码适配常驻内存特性。

FrankenPHP 没有直接等价的 pm.max_children
FrankenPHP 的进程模型和 PHP-FPM 完全不同:它不依赖“启动一堆子进程等请求”的传统 fork 模型,而是基于 Go runtime 启动一个常驻主进程,再由内置 PHP 运行时(Zend 引擎)在 worker goroutine 中复用执行上下文。所以 pm.max_children 这个概念在 FrankenPHP 里根本不存在。
你真正要关心的是它的并发控制机制——workers 和 max_workers,它们出现在 Caddyfile 或 FrankenPHP 的配置块中,作用更接近“最大并发处理单元数”,但语义和行为都变了:
-
workers是启动时预创建的 worker 数量(类似 PHP-FPM 的pm.start_servers) -
max_workers是运行时允许动态扩容的上限(类似pm.max_children的“天花板”,但不是进程数,是 goroutine 级别的并发任务槽位)
FrankenPHP 的 max_workers 怎么设才不翻车
max_workers 不是靠 CPU 核数拍脑袋定的,也不能套用“总内存 ÷ 30MB”这种老公式。它受三个真实约束共同限制:
- 单个 PHP worker 实际 RSS(不是 VIRT):PHP 8.5.5 + opcache.preload 后,常驻内存普遍在 90–130MB,用
ps aux --sort=-%mem | grep 'frankenphp' | head -n 3看 RES 列中位数 - 可用内存安全上限:系统预留 ≥1.5GB,MySQL/Redis 至少占 1GB,剩余 × 0.65 才能用于 FrankenPHP
- I/O 阻塞容忍度:FrankenPHP 的 worker 是协程友好型,但遇到未设超时的 cURL、PDO 查询或 file_get_contents,会卡住整个 goroutine;
max_workers设太高反而放大阻塞影响
实操建议:
- 初值按
floor(可用内存 × 0.65 ÷ 单 worker RES)计算,比如 8GB 服务器实测单 worker 占 110MB → ≈ 47,先设max_workers 40 - 必须配
timeout 30s在 Caddyfile 的php指令块内,否则慢请求会把所有 worker 占满 - 开启
log_level debug并观察workers.active和workers.idle指标,若长期active == max_workers且响应延迟上升,才说明真瓶颈在此;否则大概率是 DB 或外部 API 拖累
从 PHP-FPM 切到 FrankenPHP 后,pm.max_requests 去哪了
FrankenPHP 默认没有 pm.max_requests 对应项——因为 worker 是常驻的,不靠“重启进程”来释放内存。但它提供了更细粒度的生命周期控制:
-
worker_idle_timeout:空闲 worker 超过该时间自动回收(默认 30s),防长连接堆积 -
worker_max_lifetime:强制 worker 最多存活多久后重建(单位秒),用于兜底防内存缓慢泄漏(PHP 8.5.5 下建议设3600,即 1 小时) -
worker_max_requests:每个 worker 最多处理多少请求后退出(可选,非必需),值设为 500–2000 即可,比 PHP-FPM 的保守些,因常驻态下内存压力更持续
注意:这三个参数必须同时设,不能只开一个。例如:
php {
workers 8
max_workers 40
worker_idle_timeout 30s
worker_max_lifetime 3600
worker_max_requests 1000
}
迁移时最容易忽略的一点
FrankenPHP 的 worker 是共享同一个 PHP 进程空间的,所以 $_SERVER、静态变量、全局对象、opcache 编译状态全部跨请求复用。这意味着:
- Laravel 的
app()容器实例、配置缓存、路由缓存都是常驻的,性能提升明显 - 但如果你代码里写了
static $counter = 0; $counter++;或直接改$_SERVER['REQUEST_TIME'],下次请求就会看到脏数据 - 所有“假设每次请求都是干净环境”的旧习惯,在 FrankenPHP 下会立刻暴露成 bug
别只盯着参数换名,得检查代码是否真适配常驻模型。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











