HTTP/3在FrankenPHP中TTFB平均降15–25%,弱网下加载完成时间减30%以上;需满足experimental_http3启用、443端口TLS加密、客户端支持三条件,否则降级;真实瓶颈常在PHP同步I/O而非协议层。

HTTP/3 在 FrankenPHP 里到底快不快
实测来看,HTTP/3 在 FrankenPHP 中的性能提升不是“翻倍”,但对特定场景确实有可感知收益:首字节时间(TTFB)平均降低 15–25%,弱网(高丢包、高延迟)下页面加载完成时间能减少 30% 以上。它值不值得开,取决于你服务的用户网络分布和是否用到了 HTTP/3 的核心能力,比如 0-RTT 连接复用或多路复用抗队头阻塞。
FrankenPHP 开 HTTP/3 的硬性前提
必须满足三个条件,缺一不可,否则 curl --http3 会直接失败或降级到 HTTP/2:
- Caddyfile 全局块中启用
experimental_http3(注意是 experimental,目前仍标记为实验性) - 服务器监听的端口必须是
443,且 TLS 已启用(HTTP/3 强制要求加密) - 客户端支持 HTTP/3 —— Chrome 110+、Firefox 119+、curl 8.0+(需编译带
nghttp3和quiche)
漏掉任意一条,alt-svc 响应头就不会出现,浏览器也不会尝试 HTTP/3 升级。
HTTP/3 在 FrankenPHP 中的真实瓶颈
FrankenPHP 自身对 HTTP/3 的支持是原生的,但实际吞吐受限于 PHP 层而非协议层。尤其在 worker 模式下,如果 PHP 代码里有大量同步 I/O(如未加 async 的 PDO 查询、file_get_contents 调用),HTTP/3 的并行优势会被卡住。这时候你看到的“没变快”,问题不在 experimental_http3,而在 PHP 代码没适配协程或异步模型。
立即学习“PHP免费学习笔记(深入)”;
典型表现:
- 压测时 QPS 上不去,但 CPU 利用率不高,
frankenphp进程多数时间在wait状态 -
curl -I https://example.com --http3返回正常,但curl -w "@format.txt" -o /dev/null -s https://example.com测出的延迟和 HTTP/2 几乎一致 - Wireshark 抓包能看到 QUIC 握手成功,但应用层响应时间波动大、无规律
要不要开?看这三点再决定
不开 HTTP/3 也不影响功能,FrankenPHP 默认走 HTTP/2 完全可用。但如果你符合以下任一情况,建议打开并保留观察:
- 用户大量来自移动网络(4G/5G),尤其是国内三大运营商晚高峰时段
- 前端用了 Service Worker + HTTP Cache,且频繁触发后台 fetch(HTTP/3 的连接复用对这类短连接更友好)
- 已启用
frankenphp的 worker 模式,并做了 PHP 层异步改造(如用Swoole\Coroutine或amphp)
最容易被忽略的一点:HTTP/3 的真实收益往往藏在 P95/P99 延迟里,而不是平均值。别只看 ab 或 wrk 的 mean,用 hey -z 30s -q 50 -c 100 https://example.com 并关注 95th percentile —— 这里才体现 HTTP/3 抗抖动的能力。



















