2009-09-06 166 views
1

我正在使用簡單的jQuery DIV刷新代碼。jQuery DIV刷新

變種refreshId =的setInterval(函數() { $( '#refreshdash')負載( 'dashboard.php緩存=?'); },4000);

對不對?有些人告訴我,在文件末尾添加「?cache =」將有助於降低帶寬等,因爲他告訴我緩存文件或類似的東西。

我不相信他曾經如此。這是真的? ...如果不是,那究竟是什麼,什麼都沒有?

+1

與大家一樣,我經常在我的頁面上做這個,我在其中包含一個css或.js文件,並且設置一個變量作爲文件版本,然後當我需要更新這些文件時,我只需更改然後我的瀏覽器會知道不使用緩存版本 – JasonDavis 2009-09-06 19:40:32

回答

5

不,這實際上與發生的事情完全相反。

瀏覽器根據它們的URL緩存內容。通過將額外的查詢參數添加到URL的末尾,您可以有效地更改從其獲取的位置,因此瀏覽器在被更改的情況下被迫重新請求內容。爲此,在最後添加cache=x參數是一種稱爲緩存中斷的技術。

例如:

http://example.com/index?timestamp=100 
http://example.com/index?timestamp=567 

無論這些URL可能會返回相同的內容,但兩者是不同的網址,因此將分別緩存。

常見的緩存中斷技術是將當前時間戳添加到URL,因爲這將始終在更改,以確保每次都會生成新的URL。

但是,這會帶來增加的帶寬,而不是減少它,因爲瀏覽器每次都需要重新獲取您的內容。

此方法的最佳用途是針對很少更改的靜態文件,但可能會被代理服務器或其他HTTP緩存長時間緩存。我用這個爲.js.css文件。我會將文件的上次修改時間附加到URL上...每當文件更新時,URL發生變化,瀏覽器知道要重新獲取它們。

+0

這非常有幫助。謝謝。 – Homework 2009-09-06 19:44:31

1

如果你把一個帶有隨機字符串的查詢字符串(比如?cache =)放到URL的末尾,那麼會阻止緩存。它會強制每次向該URL發出請求時向服務器進行新的往返。

更多信息,請here

+0

('GET','yourscript.php?ms ='+ new Date()。getTime(),true);現在有這麼多意義。謝謝。 – Homework 2009-09-06 19:45:09

1

是,通過一個隨機變量(如當前時間戳+哈希一些),當你想阻止緩存結果的瀏覽器是有益的。但是,你必須使用像「?緩存= your_random_variable「(例如:?cache = abc9623498385023)。

1

默認情況下動態頁面不會緩存,因爲php會發送頁眉以使頁面不被緩存。您可以發送適當的標題以使頁面被緩存,但不會默認。

您可以使用Firebug的Net Panel進行測試。它會告訴你是否從緩存中加載了某些內容。

1

通常這種技術主要用於靜態內容。

您的腳本返回頭文件告訴瀏覽器長時間緩存 - 這會降低帶寬,因爲瀏覽器將使用緩存副本而不是請求新緩存副本。非常適合JavaScript庫,徽標,CSS文件等等。

缺點是,當你改變東西時,人們不會看到它們,因爲它們已被緩存。當你有相互依賴的時候,這可能會更糟 - 比如一個新的JavaScript小部件庫,它依賴於你的CSS文件或其他JavaScript文件的新版本。如果只有一個被加載,頁面可能不會正常工作。

對此的一個半解決方案是將到期時間設置爲平衡時間,例如一天,以便每個人最終將請求新內容(以每天至少抓取一次內容的帶寬稍微增加爲代價) )。但是,這並不解決依賴性問題。

使用隨機參數(?cache =)是解決此問題的絕佳解決方案。基本上,服務器忽略參數,但對於瀏覽器來說,不同的參數意味着不同的URL。您的主站點可以知道內容何時更改,從而更改參數值,迫使瀏覽器在其更改的瞬間(不存在過時緩存或依賴項問題,假設您的代碼沒問題)刷新。

參數名稱並不重要,它的值也不重要 - 顯然你想避免將被服務器解釋的東西。這個機制的熱門選擇: * md5的文件(緩存此服務器端以及,因爲它可能是昂貴的計算) *文件的日期/時間,或日期/時間散列 *版本號文件或整個網站(如果您每次部署任何新內容時都增加版本)

Theres博客發佈了關於他們如何做caching on stackoverflow。我見過


另外一個方案是部署到,默認情況下發送導致內容緩存,例如頭一個服務器,使用了一些託管服務提供商要做到這一點(可能還有事,但還沒在十年內沒有看到這個問題)。通過設置?cache =你可以解決這個問題。這裏真正的解決方案是讓你的服務器在默認情況下不緩存,如果這對你的使用沒有意義。