2014-04-09 96 views
1

我正在使用Minify(https://code.google.com/p/minify/)壓縮併合並〜30個css文件和〜10個javascript文件。我爲這些文件創建了一個組配置,這基本上是一個包含文件名的數組。在瀏覽器中強制高速緩存更新

工程就像一個魅力,除非其中一個腳本被修改:瀏覽器緩存不及時更新。我曾經獲得每個文件(使用filemtime)最後修改的時戳否決瀏覽器緩存:

$time = '?' . filemtime($filename); 
$output = '<link type="text/css" rel="stylesheet" href="'.$file_path.'?'.$time.'" />'; 

我可以遍歷所有40個文件,以獲得最新的時間戳,但是這是一個非常醜陋的解決方案。另一種方式是例如讓crobjob檢查它並將時間戳記寫入一個文件,然後我可以包含它。

在我發明輪子之前有什麼其他的方法嗎?

+0

可以使用Cache-Control和過期的性質通過使用PHP處理程序php頭,並重定向靜態文件請求vi重寫規則。請參閱我的答案以獲取更多詳細信息 –

回答

0

你能不能再補充:

src="path/to/file.css?v=<?php date(dmy); ?>" 
+0

我甚至可以添加?v = <?php time()?>;)但寧願儘可能多地使用緩存。 – Lennart

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 – nKn

+0

我不能評論PHP標籤不斷編輯@nKn – MarkP

0

剛剛獲得$file_path的修改時間......?就個人而言,我有更合理數量的文件(兩個或三個),每個文件都分別緩存,其中包含mtime。精美的作品。

+0

這是一個模塊化的系統,其中每個模塊都有自己的CSS文件;因此有40個文件。 – Lennart

+0

我的系統也是模塊化的,因爲網站的每個頁面都有一個核心文件和一個文件;) –

+0

我以前也有這個功能;現在這些文件被組合起來,用戶首次訪問時將獲得他們需要的所有css和js(這是登錄頁面,因此他們不會注意到在後臺加載文件)。加快所有其他頁面加載:) – Lennart

0

我可以建議你一種方式,你需要定義一個重寫規則並實現靜態文件加載的處理程序。假設它是assethandler.php,和你的重寫規則;

RewriteRule ^nocache/(.*?)$ assethandler.php?f=$1 [QSA,L] 

而且在PHP中您可以使用Cache-Control and Expires用於獲取最新的總文件;

header("Cache-Control: no-cache, must-revalidate"); 
header("Expires: Mon, 01 Jul 1990 05:00:00 GMT"); // past date 
readfile('path_to_static_files/' . $_GET['f']); 

和你的靜態文件請求會是這樣的;

<script src="nocache/your.js"/> 

簡單地說,當你犯了一個請求nocache/filename這將作爲assethandler.php?f=filename處理,並且在此處理,緩存總是禁用和文件內容擔任最新內容

+0

我不想要一種方法來完全禁用緩存。 – Lennart

+0

僅當您使用路徑'nocache/...'時,纔會禁用緩存。 –

相關問題