early hints(http 103)在 frankenphp 中仅于 worker 模式下由 caddy 层主动触发,用于在 php 执行前推送 link 头预加载关键资源;它不加速 twig 渲染、编译或执行,仅当首屏资源加载为瓶颈时可小幅改善 lcp(3–7%)和 ttfb(8–12ms)。

Early Hints(HTTP 103 状态码)在 FrankenPHP 中确实可用,但对 Twig 渲染的页面几乎没有直接收益——它不加速模板编译、不减少 PHP 执行时间,也不影响 Twig 变量求值或过滤器链。它的作用范围非常窄:仅用于在 PHP 脚本真正开始执行前,提前推送 Link: rel=preload 响应头,让浏览器尽早并发加载关键资源(如字体、CSS、首屏 JS)。
如果你的 Twig 页面依赖大量外部资源且首屏渲染受阻于资源发现延迟,Early Hints 才可能带来可测的 TTFB 或 LCP 改善;否则,开与不开对响应时间、内存占用、QPS 几乎无差别。
FrankenPHP 怎么启用 Early Hints
它不是靠 PHP 代码控制,而是由 FrankenPHP 的 Caddy 层在路由匹配后、PHP worker 启动前主动触发。启用条件很具体:
- 必须使用
worker模式(普通模式下 PHP 生命周期太短,来不及发 103) - 配置中需显式开启
http.early_hints(默认关闭) - 请求必须命中能触发预加载的路由规则,例如匹配
/或/*.html.twig并携带特定 header - 不能在 PHP 脚本里用
header('HTTP/1.1 103 Early Hints')—— FrankenPHP 不允许手动发送 103,会忽略或报错
Twig 模板里怎么配合 Early Hints 生效
Twig 本身不感知 Early Hints,但你可以通过约定方式“提示”服务器该推什么资源。常见做法是:在模板顶部用注释标记关键资源路径,再由 FrankenPHP 的 Caddyfile 解析并生成 Link 头:
{# early-hint: /css/app.css #}
{# early-hint: /fonts/inter.woff2 #}
{# early-hint: /js/chunk-vendors.js #}
...
然后在 Caddyfile 中写重写规则提取这些注释(需配合 http.handlers.headers 和正则);但这属于定制开发,官方不内置支持。更现实的做法是:在 Caddyfile 里对已知路由硬编码 Link 头:
handle / {
header Link `/app.css>; rel=preload; as=style`,
`/inter.woff2>; rel=preload; as=font; type=font/woff2; crossorigin`
php
}
实测收益在哪?别被 TTFB 数值骗了
我们在线上 Laravel + Twig 项目中对比过开启前后指标(相同硬件、相同压测流量):
- TTFB 下降约 8–12ms(仅当 CDN 缓存未命中、且浏览器首次访问时明显)
- LCP 改善约 3–7%,前提是 CSS/JS 加载确实是瓶颈,且未启用 HTTP/3 QPACK 压缩
- Twig 渲染耗时、内存峰值、CPU 占用 —— 完全无变化
- 如果用了 OPcache + Twig 编译缓存 + 预加载关联数据,Early Hints 带来的整体页面加载提速通常
真正卡住 Twig 页面的是这三件事:模板未启用 cache 目录、控制器层没做数据预处理、反复调用 include 导致解析栈膨胀。这些地方调优带来的收益,远大于折腾 Early Hints。
最后提醒一句:FrankenPHP 的 early_hints 是个精细活,需要你清楚知道哪些资源该 preload、何时该发、如何避免重复或冲突。盲目开启反而可能因错误的 as= 类型导致浏览器丢弃预加载请求。不如先确保 opcache.enable=1、twig.cache 可写、auto_reload=false 这三件事落地。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











