frankenphp默认不启用http/3,必须在caddyfile全局块中显式配置{ servers { protocol { experimental_http3 } } },并确保udp 443端口开放、启用https,否则无法生效。

FrankenPHP开HTTP/3必须显式启用
不写配置就用不上HTTP/3。FrankenPHP虽然内置了HTTP/3支持,但默认是关闭的——它不会自动开启,也不会在Caddyfile里偷偷帮你加参数。
必须在Caddyfile全局块里加experimental_http3
HTTP/3启用逻辑完全由Caddy的servers模块控制,FrankenPHP只是复用这个能力。你得手动在Caddyfile最顶部的全局配置块里写:
{ servers { protocol { experimental_http3 } } frankenphp { num_threads auto } }
注意几点:
-
experimental_http3必须写在servers块内,不能放在站点块(如example.com { ... })里 - 只加这一行还不够,还得确保UDP端口443被正确暴露(Docker部署时要加
- "443:443/udp") - 如果用
SERVER_NAME=:80禁用HTTPS,HTTP/3会直接失效,因为HTTP/3强制依赖TLS 1.3
验证HTTP/3是否真生效,别信“配置写了就行”
很多配置看似正确,但实际没跑起来。最简单可靠的验证方式是:
curl -I https://yourdomain.com --http3
如果返回头里有alt-svc: h3=":443"; ma=86400,说明服务端已通告HTTP/3;再用curl --http3 --head https://yourdomain.com能拿到响应,才算真正走通。
常见失败点:
- 防火墙或云厂商安全组没放开UDP 443端口
- Caddyfile里漏了
servers块,或拼写错误(比如写成experimential_http3) - 本地curl版本太老,不支持
--http3参数(需curl ≥ 7.64.0且编译时启用了nghttp3+quiche)
HTTP/3和worker模式可以共存,但别指望它自动优化PHP性能
开了HTTP/3只是传输层升级,对PHP执行本身没加速作用。想真正压降框架初始化开销,还得单独配frankenphp_worker入口、改index.php启动逻辑、设MAX_REQUESTS——这些和HTTP/3配置完全正交,容易误以为“开了HTTP/3就等于常驻内存”。
真正关键的那条线:HTTP/3解决的是客户端到服务器的连接效率,worker模式解决的是PHP进程生命周期管理。两者都得自己动手,一个都不能少。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











