首頁  >  文章  >  web前端  >  關於HTTP/2伺服器推送

關於HTTP/2伺服器推送

php中世界最好的语言
php中世界最好的语言原創
2017-12-30 18:00:232378瀏覽

在說HTTP/2伺服器推送之前首先我們要知道,HTTP/2被設計成解決HTTP/1.x的許多缺陷。當代網頁使用了許多資源:HTML、樣式表、腳本、圖片等等。在HTTP/1.x中這些資源每一個都必須明確地請求。這可能是一個很慢的過程。所以瀏覽器從取得HTML開始,然後在它解析和評估頁面的時候,增量地取得更多的資源。因為伺服器必須等待瀏覽器做每個請求,網路經常是空閒的和未充分使用的。

為了改善延遲,HTTP/2引入了server push,它允許服務端推送資源給瀏覽器,在瀏覽器明確地要求之前。一個伺服器經常知道一個頁面需要很多附加資源,在它回應瀏覽器第一個請求的時候,可以開始推送這些資源。這允許服務端去完全充分地利用一個可能空閒的網絡,改善頁面載入時間。

serverpush.svg.png

在協定層,HTTP/2 server push被push_promise 幀所驅動,一個PUSH_PROMISE描述了一個請求,即服務端預測瀏覽器將馬上要發出的請求。瀏覽器一收到PUSH_PROMISE,它馬上知道服務端將要傳輸這個資源。如果瀏覽器後續發現它需要這個資源,它會等待這個推送完成,而不是發送一個新的請求。這減少了瀏覽器花在網路等待上的時間 。

net/http套件中的服務端推送

go1.8引入了來自http.Server對推送回應的支援。如果執行的server是一個HTTP/2的服務,而進來的連線是使用HTTP/2的時候,這個特性是可用的。在任一HTTP handler中,你可以判斷http.ResponseWriter是否支援服務端推送,透過檢查它是否實作了新的http.Pusher介面。

例如,如果server知道app.js將要被要求來渲染頁面,如果http.Pusher可用,handler可以初始化一個push。

 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        if pusher, ok := w.(http.Pusher); ok {
            // Push is supported.
            if err := pusher.Push("/app.js", nil); err != nil {
                log.Printf("Failed to push: %v", err)
            }
        }
        // ...
    })

相信看了以上介紹你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

相關閱讀:

JS引擎運行時是什麼樣的

#原生JS如何實作AJAX、JSONP

JS的使用過程中如何自訂console物件

#

以上是關於HTTP/2伺服器推送的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn