2011-07-05 20 views
2

所以我一直在使用Minify來壓縮我的JS和CSS,它們都很好,直到我需要壓縮一些動態的php樣式表。縮小動態php樣式表

我試圖用htaccess的將它誤以爲它是一個CSS文件,但後來我意識到它使用了不會被mod_rewrite的

來實現絕對文件路徑,反正只要我點它在一個PHP文件,它總是返回'400錯誤請求'。除了編寫我自己的壓縮腳本之外,如何解決這個問題的任何想法?

+0

什麼是動態的,PHP的樣式? –

+0

所以你想使用一個與平面文件一起工作的工具來壓縮動態創建的東西。這聽起來有點不對..你不可能? :) –

+0

我將這添加爲註釋,因爲它是在黑暗中刺:嘗試製作一個靜態css文件,然後在那裏包括動態的與@import語句,然後縮小靜態。如果它有效,讓我知道我會將它添加爲答案;)順便說一句,我知道你應該避免@import,但嘿。 – picus

回答

6

我發現處理縮小和壓縮樣式表的最好方法就是自己動手。看看這個代碼:

<?php 
header("Content-Type: text/css"); 
header("Last-Modified: ".gmdate('D, d M Y H:i:s', filemtime($_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF']))." GMT"); 
header("Expires: ".gmdate('D, d M Y H:i:s', (filemtime($_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF']) + 691200))." GMT"); 

//This GZIPs the CSS for transmission to the user 
//making file size smaller and transfer rate quicker 
ob_start("ob_gzhandler"); 
ob_start("compress"); 

//Function for compressing the CSS as tightly as possible 
function compress($buffer) { 
    //Remove CSS comments 
    $buffer = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $buffer); 
    //Remove tabs, spaces, newlines, etc. 
    $buffer = str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', $buffer); 
    return $buffer; 
} 

//Main style 
require_once($_SERVER['DOCUMENT_ROOT']."/templates/style/style.css"); 

//Other style 
if($php_variable) { 
    require_once($_SERVER['DOCUMENT_ROOT']."/templates/style/other.css"); 
} 

ob_end_flush(); 
ob_end_flush(); 
?> 

這裏有很多事情正在進行,所以讓我解釋一下。

  • 設置文件類型爲CSS。
  • 設置緩存控制的Last-ModifiedExpires標題(設置稍微超過一週,您可以更改此設置)。

縮減大小和GZIP

  • 使用ob_start,我們告訴它GZIP文件以及運行自定義功能compress
  • compress發送到瀏覽器時刪除所有CSS註釋和空格。這意味着您可以將所有評論和間隔保持在源文件中,以便於編輯,但只能將最低限度的內容發送到瀏覽器。

風格

  • 使用require導入樣式表。按照你的意願去做盡可能多的樣式表;他們將全部通過一個HTTP請求交付給用戶。

使用新文件

你會在文件中調用,就像你一個正常的CSS文件。

<style type="text/css" src="/path/to/css-script.php"></style> 

結論

使用這種方法,你正在做幾件事情真棒。

  • 爲緩存提供正確的標題,使您可以快速訪問您的網站。
  • Minifys的所有內容不包含額外的空白或評論。
  • 使用GZIP壓縮文件以獲得更小的文件大小。
  • 在一個HTTP請求中包含所有樣式表,非常適合優化。
  • 避免使用@import聲明......這本身就非常棒。
  • 允許您保留多個樣式表並使用PHP邏輯來包含或不包含它們。
  • 允許你保持你的源代碼樣式表的間隔和評論,只要你喜歡,對訪問者沒有任何影響。

雖然上面的compress函數嚴格用於CSS,所以我會省略它,但您也可以對JavaScript使用相同的方法。

使用此技術在這個高速緩存控制技術相結合,並且你已經建立了自己的真棒CSS/JS處理程序:How to force browser to reload cached CSS/JS files?

+1

我不得不適應這一點我自己。 Minify對CSS非常慢。 – timw4mail

+0

哈完美的答案,很好的一個章節:)希望我可以給你獎勵積分過度使用這個詞真棒:P – Horse

+0

只是爲了說明,不會與safari一起工作,因爲缺乏gzip支持 – Horse