PHP實現BigPipe分chunked輸出_PHP教程

來源:互聯網
上載者:User
在Yahoo系的最佳實務裡,建議把靜態內容儘早的輸出,在head之後就調用flush,讓瀏覽器可以儘早去載入靜態資源,包括指令碼、樣式、圖片(javascipt,css,image一般是外鏈的形式)等等,後台如果有多個資料來源或者api需要調用,儘可能做到完成一個輸出一個,通過js在前端拼裝頁面,進而達到最佳化使用者體驗的效果,使用者等待的時間,是木桶最短的那快木板。
下面是引用:
Flush the Buffer Early
tag: server
When users request a page, it can take anywhere from 200 to 500ms for the backend server to stitch together the HTML page. During this time, the browser is idle as it waits for the data to arrive. In PHP you have the function flush(). It allows you to send your partially ready HTML response to the browser so that the browser can start fetching components while your backend is busy with the rest of the HTML page. The benefit is mainly seen on busy backends or light frontends.
A good place to consider flushing is right after the HEAD because the HTML for the head is usually easier to produce and it allows you to include any CSS and JavaScript files for the browser to start fetching in parallel while the backend is still processing.
Example:

...



...
Facebook提出的BigPipe技術,將這種思想有了更具體的實現,大體思路是,分解網頁成叫做Pagelets的小塊,然後通過Web伺服器和瀏覽器建立管道並管理他們在不同階段的運行。
在php下做個小測試,

';ob_flush();flush();sleep(2);echo "b";?>
結果可以看到在ie下(7,8),不管輸出內容的大小,都可以看到效果,“b“在2秒後輸出,在firefox和chrome,兩段文本都在2秒後展現,說明瀏覽器做了緩衝,經過實驗,緩衝的大小為1024,剛好1k,也是瀏覽器做的最佳化。通過返回頭可以看出,在分段輸出的時候,返回包沒有經過gzip。

通過wireshark可以看到後台輸出確實是一個個chunked過來的,看來是瀏覽器做了工作,猜測:緩衝大小應該是1024B或者MTU大小(1400B多點,看網路情況),首段輸出增大到1024的時,chrome和firefox都開始正常表演了,頁面裡的js、css和圖片在第一段下載完已經開始載入。

應該思考的問題:
1、傳輸效率,盡量利用一次傳輸傳送盡量多的東西,根據MTU大小調整;
2、同步載入,第一塊送過來的東西,盡量可以同步載入,需要注意不同瀏覽器可以同步載入網域名稱的數量,需要考慮javascript對載入的block,對於不用立刻執行的內容,可以通過加defer或者乾脆注釋掉,等頁面完成在eval進來;
3、適用範圍,任何一個技術都有自己適用的情境,對於後台需要訪問多個api的應用會更適合一些,像社交類的網站,搜尋之類的本來就在100ms左右就展現完畢,純玩兒技術就沒意義了,chunked也不是分的越多越好,適當的,類似的最好合并起來;
4、ob_flush和flush最好結對使用,某些情況下,當用flush是沒有效果的。

參考:

http://www.BkJia.com/kf/201202/118114.html

http://developer.yahoo.com/performance/rules.html#flush

http://www.BkJia.com/kf/201202/118116.html

http://www.BkJia.com/kf/201202/118117.html

http://baike.baidu.com/view/4601904.htm

http://www.BkJia.com/kf/201202/118118.html

http://www.bkjia.com/PHPjc/478421.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/478421.htmlTechArticle在Yahoo系的最佳實務裡,建議把靜態內容儘早的輸出,在head之後就調用flush,讓瀏覽器可以儘早去載入靜態資源,包括指令碼、樣式、圖片(...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.