FrankenPHP的worker进程数由运行时配置决定:php_server指令用num_threads、全局frankenphp块用worker.num设置,须满足num_threads×memory_limit<可用内存−2GB,并配合Octane时确保--workers≤workers.count且指定--server=frankenphp。

FrankenPHP 安装后,worker 进程数不是靠“安装步骤”决定的,而是由运行时配置控制——核心在于你用哪种模式启动(经典模式还是Worker 模式),以及对应配置中明确指定的线程/worker 数量。
看你是用 php_server 还是全局 worker 配置
FrankenPHP 不像 PHP-FPM 那样有独立的 pool 配置文件。它的并发执行单元数量,取决于你在 Caddyfile 或启动命令里怎么写:
- 如果你用
php_server指令(推荐 Laravel/Symfony 等框架),直接加num_threads参数:php_server index.php {<br> num_threads 6<br>} - 如果你用全局
frankenphp块启用 Worker 模式,则在worker子块里设num:frankenphp {<br> worker {<br> num 6<br> }<br>}
数值不能随便填,得守内存底线
每个 worker 线程会独占一份 OPcache、autoload 映射和框架实例,实际内存开销远超 memory_limit。安全公式是:
num_threads × memory_limit < 服务器可用内存 − 2GB(建议余量)
立即学习“PHP免费学习笔记(深入)”;
例如:4 核 8GB 内存服务器,memory_limit = 192M,那 num_threads 最多取 floor((8−2)×1024÷192) = 31,但实际起步建议从 4~6 开始压测——线程越多,上下文切换和内存竞争越明显。
配合框架时,别漏关键约束
如果你同时跑 Laravel Octane,必须注意两层关系:
-
workers.count(即上面的num_threads或worker.num)是底层线程池上限 - Octane 的
--workers=4是应用层子进程数,必须 ≤ 前者 - Octane 启动命令必须带
--server=frankenphp,否则它走 Swoole,完全无视 FrankenPHP 的线程配置
调完要验证是否生效
别只看配置文件,实打实确认运行态:
- 执行
ps aux | grep frankenphp-worker,数一下进程数(波动 ±1 正常) - 访问
/metrics(需开启 Prometheus 支持)或查日志,确认frankenphp_total_threads和你设的值一致 - 压测时盯
frankenphp_queue_depth:持续上涨说明线程不够,请求排队了



















