2014-09-11 34 views
0

我有一個名爲main.css.php的php文件,它收集多個css文件並將它們輸出爲一個大的css文件。它收集的css文件的數量可以從1到10。該代碼是這樣的:什麼是緩存(自動版本)通過組合多個css文件創建的php文件的有效方法?

header('Content-type: text/css'); 
header('Cache-Control: max-age=31536000'); 
ob_start("compress"); 
function compress($buffer) { 
    /* remove comments */ 
    $buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer); 
    /* remove tabs, spaces, newlines, etc. */ 
    $buffer = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $buffer); 
    return $buffer; 
} 

// include css files 
foreach ($css_files as $path) { 
    if (file_exists($path)) { 
     include_once($path); 
    } 
} 
ob_end_flush(); 

所以我的那部分排序的,但現在我不知道如何使用的方式,讓我更新緩存如果任何原始css文件的更改進行緩存。作爲this answer建議我要做的事情是這樣的:不過,我不能用這個阿帕奇重寫規則

$cache = ""; 
foreach ($css_files as $path) { 
    $cache.= filemtime($path); 
} 
... 
echo "<link rel='stylesheet' href='/css/base.{$cache}.css'>"; 

RewriteEngine on 
RewriteRule ^(.*)\.[\d]{10}\.(css|js)$ $1.$2 [L] 

因爲我不知道在$緩存有多長因爲它將包含多個unix時間戳。

摘要

我需要多個CSS文件合併成發送到瀏覽器中使用CSS頭一個PHP文件。然後我需要正確緩存這個文件,但是如果任何一個原始的css文件發生變化,我可以通過這種方式來更新緩存。

任何意見,建議,或更好的方式去了解我在做什麼,將不勝感激。

回答

1

您應該對$cache變量進行散列並將其用於文件名中。它會是這樣的:

<?php 

$cache = ""; 
foreach ($css_files as $path) { 
    $cache .= filemtime($path); 
} 

$cache = md5($cache); 

而你的重寫規則將使用散列函數的長度;在這種情況下,我們使用md5,這是32個字符長:

RewriteEngine on 
RewriteRule ^(.*)\.[\d]{32}\.(css|js)$ $1.$2 [L] 

希望幫助

+0

我對哈希算法不太熟悉,但看起來好像會起作用,會給它一個鏡頭。 – joshhunt 2014-09-11 04:47:23

1

爲什麼不存儲在磁盤緩存信息?這樣你就不用擔心.htaccess。

$prevTimes = filegetcontents('/cache/css.txt') 
if(array_sum($filetimes) != (int) $prevTimes){ 
    //recompile css 
    //update csscacheinfo.txt with $newTimes 
    //echo css file link for stylesheet using $newTimes.css as css file 
} else { 
    //echo css file link for stylesheet using $prevTimes.css as css file 
} 

僅供參考:存儲/添加整數比拼接和比較字符串要快。

+0

如果它被緩存了,瀏覽器如何知道什麼時候查找新版本? – joshhunt 2014-09-11 04:51:30

+0

當然這是一個更清潔的解決方案,但您的供參考意見是誤導性的;通過避免字符串連接獲得的任何微妙的性能都會通過轉到磁盤並在每個頁面訪問時轉換爲int而丟失。但是,差別還是很小的,所以這仍然是緩存文件的最佳方式。 – wavemode 2014-09-11 04:52:00

+0

@wavemode PHP不斷從磁盤讀取文件。要求等等。在我的評論中,我只是指他將所有時間都作爲一個字符串加在一起的事實。所以他正在轉換數據類型,然後建立一個新的字符串,大概在稍後比較字符串。 – 2014-09-11 04:54:43

相關問題