FRANKENPHP_CONFIG 是 Caddy 模板变量,仅用于注入合法的 frankenphp 指令块(如 num_threads 4、php_ini memory_limit 512M),不可随意填写任意配置,否则导致 Caddy 解析失败;其内容必须符合 frankenphp 块语法规范,且需通过 caddy validate 验证。

FRANKENPHP_CONFIG 不是 FrankenPHP 官方支持的、可自由填写的配置字符串环境变量,它只是一个占位符,用于在 Caddyfile 中插入预定义的 frankenphp 指令块 —— 你不能直接往里面塞任意配置项,否则 Caddy 启动会失败。
为什么 FRANKENPHP_CONFIG 看起来像“可配置”,但实际不能乱填
你在默认 Caddyfile 里看到的这行:
{ frankenphp { {$FRANKENPHP_CONFIG} } }
本质是 Caddy 的模板变量语法,由容器启动时通过环境变量注入一段合法的 frankenphp 指令(比如 num_threads 4)。它不是 PHP 配置项的拼接槽,而是 Caddy 配置语法的一部分。一旦你往 FRANKENPHP_CONFIG 里写错格式(比如漏了大括号、混入注释、用了未定义指令),Caddy 解析就会报错:unexpected token 或 unknown directive 'xxx'。
真正能配的,只有 frankenphp 块内明确支持的指令
这些指令必须出现在 { frankenphp { ... } } 块中,且顺序和嵌套有严格要求。常见可用项包括:
立即学习“PHP免费学习笔记(深入)”;
-
num_threads <int|auto>:启动时初始化的 PHP 线程数,建议设为 CPU 核心数 ×2;auto表示由 FrankenPHP 自动推算 -
max_threads <int|auto>:运行时允许动态扩容的最大线程数,默认等于num_threads -
max_wait_time <duration>:请求等待空闲线程的超时时间,如10s,超时返回 503 -
php_ini <key> <value>:覆盖 php.ini 设置,例如php_ini memory_limit 512M;可重复出现 -
worker { ... }:仅在 worker 模式下有效,必须包含file <path>,其他如env、watch、name都在里面定义
注意:worker 是独立子块,不能和 num_threads 混在同一级;classic 模式下不支持 worker 块。
用 FRANKENPHP_CONFIG 注入配置的正确姿势
必须保证注入内容是语法合法、语义完整的 frankenphp 指令片段。推荐做法:
- 用单行 shell 变量拼接(避免换行和引号干扰):
FRANKENPHP_CONFIG="num_threads 4 max_wait_time 5s php_ini opcache.enable 1" - 如果含空格或特殊字符(如路径),必须整体加双引号,且确保 Caddyfile 模板解析时不被截断
- 不要试图在里面写
log、tls、reverse_proxy这类 Caddy 全局指令 —— 它们不属于frankenphp块 - Docker 环境下,建议优先改
Caddyfile本身,而非依赖环境变量注入;FRANKENPHP_CONFIG更适合 CI/CD 动态生成场景
最容易被忽略的一点:FrankenPHP 的配置最终由 Caddy 解析器校验,错误提示往往只说“syntax error near line X”,不会告诉你哪个指令不合法 —— 所以每次改完 FRANKENPHP_CONFIG,务必先用 caddy validate --config Caddyfile 手动验证,别等容器启动失败才排查。



















