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

我们的 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]


慕尼黑的夜晚无繁华
浏览 93回答 2
2回答

慕桂英4014372

HTTP 响应的第一行是状态码,例如:HTTP/1.0 200 OK所有其他标题都遵循这一行。所以,不行,不可能Link先输出一些header再发送状态码。如果是其他的header,那么单纯从HTTP的角度来说,可以先发一些header再发一些(你的web server配合不配合另当别论);但状态码不能延期。作为替代方法,您可能想要查看 HTTP/2 并提前发送这些 CSS 文件。或者,当然,以某种方式加速该数据库操作。

慕田峪9158850

你想要的是103 Early Hints状态码。这会在带有预加载链接的主要结果之前发送一条附加消息不幸的是,在服务器发送端和浏览器接收端对此的支持非常差。当一些应用程序有效地返回两条 HTTP 消息而不是通常的消息时,它们会批量处理。你现在最好的选择可能是将消息分成两部分——一个基本的 index.html “外壳”和一个将数据加载到该外壳中的 API 调用。
打开App,查看更多内容
随时随地看视频慕课网APP