我们的 PHP 系统生成如下网页:1. [Init]2. [Do some DB-queries and calculations, might take some seconds, might end up in sending a 301 or 404]3. [Output results]现在我想通过预加载 css、字体和 js 文件来加快页面速度。如果我可以像这样发送标头,那就太理想了:1. [Init]header("Link: </style.css>; rel=preload; as=style", false);2. [Do some DB-queries and calculations, might take some seconds, might end up in sending a 301 or 404]3. [Output results]但是只有在步骤 3 中开始输出时才会发送预加载标头 - 因此速度没有太大提升。所以我尝试了:1. [Init]header("Link: </style.css>; rel=preload; as=style", false);flush();2. [Do some DB-queries and calculations, might take some seconds, might end up in sending a 301 or 404]3. [Output results]哇,这真的加快了速度!但是好吧,在步骤 2 中发送 301 或 404 标头最终会出现在消息中:警告:无法修改标头信息 - 标头已由...发送所以我需要把它放在那里:1. [Init]2. [Do some DB-queries and calculations, might take some seconds, might end up in sending a 301 or 404]header("Link: </style.css>; rel=preload; as=style", false);3. [Output results]这在速度上并没有带来很大的优势,因为大耗时的事情都在第2步完成了。问:由于标头是逐行从网络服务器传输到浏览器的,我想知道是否有办法将预加载标头发送到浏览器,并在几秒钟后发送 301 标头,例如:1. [Init]header("Link: </style.css>; rel=preload; as=style", false);send_part_of_headers();2. [Do some DB-queries and calculations, might take some seconds, might end up in sending a 301 or 404]3. [Output results]
2 回答
慕桂英4014372
TA贡献1871条经验 获得超13个赞
HTTP 响应的第一行是状态码,例如:
HTTP/1.0 200 OK
所有其他标题都遵循这一行。所以,不行,不可能Link
先输出一些header再发送状态码。如果是其他的header,那么单纯从HTTP的角度来说,可以先发一些header再发一些(你的web server配合不配合另当别论);但状态码不能延期。
作为替代方法,您可能想要查看 HTTP/2 并提前发送这些 CSS 文件。或者,当然,以某种方式加速该数据库操作。
慕田峪9158850
TA贡献1794条经验 获得超7个赞
你想要的是103 Early Hints状态码。
这会在带有预加载链接的主要结果之前发送一条附加消息
不幸的是,在服务器发送端和浏览器接收端对此的支持非常差。当一些应用程序有效地返回两条 HTTP 消息而不是通常的消息时,它们会批量处理。
你现在最好的选择可能是将消息分成两部分——一个基本的 index.html “外壳”和一个将数据加载到该外壳中的 API 调用。
- 2 回答
- 0 关注
- 87 浏览
添加回答
举报
0/150
提交
取消