workers.count是frankenphp预分配的php线程总数,控制底层并发执行单元上限;需满足workers.count×memory_limit≤可用内存,推荐4核设6–8、8核设12–16,并通过frankenphp_busy_threads/total_threads比值及queue_depth压测调优。

FrankenPHP 1.4 的“多 worker 进程数量”实际指 workers.count 参数——它控制的是 PHP 线程池中可并发执行请求的底层线程数,不是传统意义上的独立进程,而是 Go 主进程中托管的、受调度的 PHP 执行单元。
这个值必须显式配置,不能依赖默认;设高了易 OOM,设低了会排队阻塞。关键不在“怎么开多个”,而在于“开多少才稳又够用”。
workers.count 怎么设才合理
- 它是 Caddy 启动 FrankenPHP 时预分配的 PHP 线程总数,每个线程可处理一个请求(同步阻塞模型下)
- 不等于 CPU 核心数 × 2(官方默认值仅作起点,生产环境通常要调低)
- 必须满足:
workers.count × memory_limit ≤ 服务器可用内存(不含 swap)
例如:
- 4 核、4GB 内存机器,
memory_limit = 192M→ 最大理论值为4096 ÷ 192 ≈ 21,但不建议直接用满 - 推荐起步值:4 核设 6~8,8 核设 12~16,再压测验证
在哪里配置 workers.count
在 Caddyfile 的 frankenphp 全局块中设置:
{
frankenphp {
workers.count 8
}
}
example.com {
php_server
}
⚠️ 注意:
-
workers.count是全局配置,写在{ }里,不是放在php_server块内 - 若同时用 Laravel Octane,Octane 的
--workers必须 ≤workers.count,且启动命令必须加--server=frankenphp
怎么验证是否配得合适
盯三个指标,比看平均响应时间更有用:
-
frankenphp_busy_threads / frankenphp_total_threads比值- 长期 > 0.9 且 QPS 上不去 → 加
workers.count - 长期
- 长期 > 0.9 且 QPS 上不去 → 加
-
frankenphp_queue_depth是否持续上涨- 上涨说明请求开始排队,线程不够用了
-
ps aux | grep frankenphp-worker | wc -l输出是否稳定- 波动 ±1 正常;持续增长或归零,说明配置冲突或崩溃重启频繁
常见踩坑提醒
- 内存超限报
Allowed memory size exhausted或系统 OOM kill:立刻检查workers.count × memory_limit是否越界 - Laravel Octane 启动报
failed to spawn worker: resource temporarily unavailable:确认--workers ≤ workers.count且带--server=frankenphp - 压测后 QPS 反降:可能是 OPcache 未预热,执行
frankenphp php-cli -r "opcache_reset();"清空全部线程缓存 - Caddyfile 误用
reverse_proxy转发到 Octane HTTP 端口:必须用php_server直接执行index.php,否则绕过 FrankenPHP 线程池
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











