2008-12-09 40 views
23

我剛讀完這篇文章:https://developer.yahoo.com/performance/rules.html#flush,並且在我的頁面加載頂部(head,css,top banner/search/nav)後已經實現了刷新。PHP沖洗:多久和最佳實踐

沖水有衝擊性能嗎?有沒有經常這樣做?什麼是最佳實踐?

如果我要爲數據創建一個外部API,是否有意義先手動刷新,以便用戶不會等待數據返回,並且至少可以在手之前獲取一些數據?

+1

由於這仍在閱讀中:請考慮通過例如一些異步處理結果通知。 WebSockets的。 (當問這個問題時,這不是問題) – Piskvor 2017-01-27 11:20:19

回答

19

描述的技術看起來不錯,但有幾個缺陷:

1)PHP腳本的開始和結束之間的時間相比是小的傳輸時間;根據你的消息來源,這也爲用戶節省了大約0.5秒的時間。這對你來說是相當長的時間嗎?

2)該技術不使用gzip輸出緩衝工作

3)如果你刷新過於頻繁,您要發送的上衝一個幾乎空包,這可能實際上增加了加載時間(對慢,嘈雜的連接)。

4)一旦你齊平,則無法發送任何頭

5)(小問題)的服務器響應會在分塊編碼,這意味着客戶端將不會提前知道的大小(因此下載文件時不會顯示「x%done」)。另一方面,如果您希望您的腳本運行時間較長(20+秒),則可能需要發送一些數據(例如空格),以防止瀏覽器超時連接。

5

不好的一面是你不能gzip的內容,以及沖洗它afaik,所以我一直喜歡gzip而不是刷新。

Some versions of Microsoft Internet Explorer will only start to display the page after they have received 256 bytes of output, so you may need to send extra whitespace before flushing to get those browsers to display the page.

這使得該不是思想,因爲它似乎填充的詳細數據不是非常有用的。

+0

然而,我同意大多數人的頭標中有更多的元數據,而不是256個字符。如果你仔細想想,這不是那麼重要。 GZip是一個很好的觀點。 – 2008-12-09 14:42:00

2

遵循Piskvor的觀點 - 如果您期待20s +等待,您最好提供一個基本頁面(可以進行gzip壓縮),並在緩慢過程完成時使用Ajax更新頁面。不過,您確實開始侵犯靜態HTML的基本功用。

3

我認爲flush是一個很好的調整機制。瀏覽器只使用大約8個線程下載內容(取決於瀏覽器)。如果你有15個圖像,瀏覽器將開始下載8個圖像,並且不會下載任何其他內容,直到其中一個完成,然後它將開始下載下一個圖像等。通過在標題後面刷新,你基本上告訴瀏覽器什麼它可以開始下載。在頁面的其餘部分被髮送(即,5秒鐘後)時,瀏覽器可能已經完成了下載css和javascript文件。這將釋放其他內容的下載線程。

您可能不希望在標題之後的任何其他位置使用flush。瀏覽器通常不會呈現未關閉的html標籤,因此發送部分頁面不會更快顯示任何內容。在收到一定數量的數據或者頁面交付完成之前,舊版IE將不會顯示任何內容。