为了账号安全,请及时绑定邮箱和手机立即绑定

仅发送部分标头(预加载/预取)

仅发送部分标头(预加载/预取)

PHP
慕尼黑的夜晚无繁华 2023-04-28 15:56:14
我们的 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 文件。或者,当然,以某种方式加速该数据库操作。


查看完整回答
反对 回复 2023-04-28
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

你想要的是103 Early Hints状态码。

这会在带有预加载链接的主要结果之前发送一条附加消息

不幸的是,在服务器发送端和浏览器接收端对此的支持非常差。当一些应用程序有效地返回两条 HTTP 消息而不是通常的消息时,它们会批量处理。

你现在最好的选择可能是将消息分成两部分——一个基本的 index.html “外壳”和一个将数据加载到该外壳中的 API 调用。


查看完整回答
反对 回复 2023-04-28
  • 2 回答
  • 0 关注
  • 87 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信