2010-07-14 87 views
0

爲了減少http請求,以及使js/css文件更容易推出,我已經安裝了我的php應用程序來連接js和css文件。使用每個文件的2個字母代碼(例如home.js代碼=「AA」)將所有包含的文件按順序合併爲一個大文件。要生成名稱,我按照它們加載的順序組合所有代碼,添加下劃線,然後添加時間戳(例如「AABACE_12345678.js」)。然後在他們的服務目錄中,我在htaccess中使用apache指令來解析php文件(唱sethandler),這樣我就可以控制標題,並且返回301標題不變。在JS/CSS緩存

不幸的是,這是行不通的......我用螢火蟲的Net面板和liveHTTPHeaders測試了它的廢話。該頁面每次都會加載該文件,即使它應該放在緩存中。這裏的響應頭文件的回報的一個示例:

Date    Wed, 14 Jul 2010 17:00:28 GMT 
Cache-Control  private 
Content-Encoding gzip 
Etag    "4b4a6d50f9acf924b9dce14e415f5c78" 
Expires    Wed, 28 Jul 2010 17:00:28 GMT 
Vary    Accept-Encoding 
X-Powered-By  PHP/5.2.6 
Last-Modified  Wed, 14 Jul 2010 16:59:35 GMT 
Content-Length  39305 
Content-Type  text/css 

注意:我省略了一些非高速緩存相關的頭,喜歡的keepAlive,服務器等

我也應該注意到,我m有條件地壓縮內容,因此是私有緩存控制頭。我在這裏錯過了什麼?內容應該由於過期標題而被緩存。我從文件名+時間戳的md5生成etag,以便從不改變文件。上次修改從未改變,過期時間永遠不會改變....

[編輯]

所以進一步檢查之後,我的css文件越來越緩存,但我的JavaScript是沒有的。如果我有兩個文件,IDENTICAL緩存標題(etag,expires,last-modified,cache-control),但唯一不同的是內容類型(一個「text/css」一個「text/javascript」),只有css正在緩存...令人沮喪的

+0

我假設你的意思是最後一個filemtime()時間戳,而不是當前時間戳? – Wrikken 2010-07-14 17:14:50

+0

@Wrikken - 正確。每次包含的js/css文件中的一個被更新時,它都會創建一個新名稱,並將當前時間戳作爲名稱的一部分。但是用於生成Etag/Last-modified頭的時間戳等於filetime()返回的內容。 – eCaroth 2010-07-14 18:32:34

+0

好的,但只是要特別確定:所需文件的時間戳保持不變,並且您在指示要加載的文件時自動記住時間戳?如果是這樣,你有我們測試的網址嗎? YOu不會是'我正在開發這個網站,因此不要在個人瀏覽器中緩存任何'個人設置'的第一個被挫敗的東西。 – Wrikken 2010-07-14 23:24:56

回答

0

這是一個有趣的練習,但在我看來,從長遠來看,如果您的網站開始越來越受到重視,服務器端組合和重命名文件可能會增加自己的開銷,可能是比只加載一些額外的文件更糟糕。我有興趣查看一些統計數據,以瞭解它對服務器負載有什麼影響。

我爲國際銀行做了一些重新設計工作 - 我的團隊重新設計了超過1,000個主要信用卡網站,其中一些網站每天獲得超過100萬個唯一身份(相當嚴重的流量)有一個人完全分配給標準和優化。最後,我們做了諸如縮小js文件之類的基礎知識,並且出於您想要克服的原因而廣泛使用sprite。但是,通過分析您所說的級別的影響,確定在人工時間內的成本將顯着超過節省的帶寬成本中的收益 - 即使在5k節省量/文件每天等於5gb帶寬的情況下也是如此。

你有做舊事的「舊辦法」的副本嗎?一旦你得到這個舔,一個比較舊的和新的分析將是很酷的。

+0

帶寬不是唯一的考慮因素。合併文件和創建精靈可以減少傳輸次數,這可以顯着減少顯示頁面的延遲。 – 2010-07-14 19:59:05

+0

這個文件只生成一次,然後在每次需要文件時提供。 JS和CSS文件已經被縮小,它們只是被連接起來以減少http請求,就像Chris Arguin所說。這一切都很好,我在這裏沒有問題。但是這些文件並沒有被緩存,這是我的問題。 – eCaroth 2010-07-14 20:12:15