我們的 PHP 系統(tǒng)生成如下網(wǎng)頁: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]現(xiàn)在我想通過預(yù)加載 css、字體和 js 文件來加快頁面速度。如果我可以像這樣發(fā)送標(biāo)頭,那就太理想了: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 中開始輸出時才會發(fā)送預(yù)加載標(biāo)頭 - 因此速度沒有太大提升。所以我嘗試了: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 中發(fā)送 301 或 404 標(biāo)頭最終會出現(xiàn)在消息中:警告:無法修改標(biāo)頭信息 - 標(biāo)頭已由...發(fā)送所以我需要把它放在那里: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]這在速度上并沒有帶來很大的優(yōu)勢,因為大耗時的事情都在第2步完成了。問:由于標(biāo)頭是逐行從網(wǎng)絡(luò)服務(wù)器傳輸?shù)綖g覽器的,我想知道是否有辦法將預(yù)加載標(biāo)頭發(fā)送到瀏覽器,并在幾秒鐘后發(fā)送 301 標(biāo)頭,例如: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條經(jīng)驗 獲得超13個贊
HTTP 響應(yīng)的第一行是狀態(tài)碼,例如:
HTTP/1.0?200?OK
所有其他標(biāo)題都遵循這一行。所以,不行,不可能Link
先輸出一些header再發(fā)送狀態(tài)碼。如果是其他的header,那么單純從HTTP的角度來說,可以先發(fā)一些header再發(fā)一些(你的web server配合不配合另當(dāng)別論);但狀態(tài)碼不能延期。
作為替代方法,您可能想要查看 HTTP/2 并提前發(fā)送這些 CSS 文件?;蛘?,當(dāng)然,以某種方式加速該數(shù)據(jù)庫操作。

慕田峪9158850
TA貢獻1794條經(jīng)驗 獲得超8個贊
你想要的是103 Early Hints狀態(tài)碼。
這會在帶有預(yù)加載鏈接的主要結(jié)果之前發(fā)送一條附加消息
不幸的是,在服務(wù)器發(fā)送端和瀏覽器接收端對此的支持非常差。當(dāng)一些應(yīng)用程序有效地返回兩條 HTTP 消息而不是通常的消息時,它們會批量處理。
你現(xiàn)在最好的選擇可能是將消息分成兩部分——一個基本的 index.html “外殼”和一個將數(shù)據(jù)加載到該外殼中的 API 調(diào)用。
- 2 回答
- 0 關(guān)注
- 123 瀏覽