2009-07-21 2 views
7

cssファイルをgzipで圧縮するcssファイルを作成するためのパブリックphpファイルを作成する方法についてのチュートリアルがあります。問題は、自分のcssファイルをキャッシュすることができないということです。私は参照のためのファイヤーバグを使用して、私は実際にいくつかのjavascriptを圧縮するために同じコードを使用してみました、そして、それはそれをうまくキャッシュします。ここでキャッシングgzipped css

はコードです:

 
if(extension_loaded('zlib')){ 
ob_start('ob_gzhandler'); 
} 
$offset = 60 * 60 * 24 * 31; 
header('Content-type: text/css'); 
header ('Cache-Control: max-age=' . $offset . ', must-revalidate'); 
header ('Expires: ' . gmdate ("D, d M Y H:i:s", time() + $offset) . ' GMT'); 
ob_start("compress"); 
function compress($buffer) { 
    // Remove Comments, White Space, End ;'s 
    $buffer = preg_replace('#/\*.*?\*/#s', '', $buffer); 
    $buffer = preg_replace('/\s*([{}|:;,])\s+/', '$1', $buffer); 
    $buffer = preg_replace('/\s\s+(.*)/', '$1', $buffer); 
    $buffer = str_replace(';}', '}', $buffer); 
    $buffer = str_replace(' {', '{', $buffer); 
    return $buffer; 
    } 

    include('global.css'); 

    if(extension_loaded('zlib')){ 
    ob_end_flush(); 
} 

は、それから私は、単に他のページのCSS文書としての私のPHPファイルを参照しています。 私はミックスに最大年齢を追加しようとしましたが、これも失敗していることがわかりました。

ここでレスポンスヘッダは

 
Date  
Tue, 21 Jul 2009 19:59:19 GMT 

Server 
Apache/1.3.41 (Darwin) PHP/4.4.9 

X-Powered-By  
PHP/4.4.9 

Cache-Control 
max-age=2592000, must-revalidate 

Expires 
Thu, 20 Aug 2009 19:59:19 GMT 

Content-Encoding  
gzip 

Vary  
Accept-Encoding 

Keep-Alive 
timeout=15, max=93 

Connection 
Keep-Alive 

Transfer-Encoding 
chunked 

Content-Type  
text/css 

私は欠けているもの、またはこれを行うことについて移動する良い方法はありますか。

おかげで、

EDIT:それは、適切なヘッダとの組み合わせで、この問題を解決したしていない場合、ファイルが304送信&を変更されたか否かを検出

スクリプト。

アーサー

答えて

7

試行: -

$offset = 60 * 60 * 24; 
header('Content-type: text/css'); 
header('Cache-Control: max-age=' . $offset); 
header('Expires: ' . gmdate ("D, d M Y H:i:s", time() + $offset) . ' GMT'); 
header('Last-Modified: ' . gmdate ("D, d M Y H:i:s", time()) . ' GMT'); 

問題は、キャッシュ制御ヘッダ内must-revalidate命令でした。これにより、クライアントは、必要になるたびにクライアントにcssを再要求させ、If-Modified-Sinceヘッダーと304未修正応答状況コードの送信にはコードが処理されません。

上記のアプローチは、キャ​​ッシュ期間を1日に短縮し、must-revalidate命令を排除します。 Last-Modifiedヘッダーも追加されます(キャッシュは、Last-ModifiedまたはETagヘッダーがないときにアイテムをキャッシュしないことがあります)。

これを改善するには、圧縮しているcssファイルの実際の最終変更時刻を見つけて、Last-Modifiedヘッダーとして送信します。 If-Modified-Sinceヘッダーとcssファイルの値が最後に変更された時刻の比較をコードに含めることができます。あなたが同じものを見つけたら、このヘッダーのセットを送信するだけでなく、304 Unmodfiedステータスを送信し、本文をまったく送信しないでください。 (私は本当にPHPの人ではありませんので、PHPの専門家にそれを残して、別の答えに記載します)。

クライアントがキャッシュを取得してからそれを取得し、それに応じてmax-age値を設定する必要があるかどうかを現実的に評価します。

+0

Hey Anthony、 私は、あなたが幸運のない、後の修正日と以前の修正日の組み合わせで示唆したように、Last-Modifiedを追加しようとしました。 以来、私はETag&Ifで修正されたヘッダーを送信しましたが、まだキャッシュされていません... お返事ありがとうございます。今後の参考とデバッグのために、この点を念頭に置いておきます。 – askon

+0

@askon:これらは重要な要素ではありませんでしたが、重要な問題は、Cache-Controlヘッダーにmust-revalidate命令を含めることです。これを使うと、CSSは常に再フェッチされます。また、テストでページリフレッシュ(F5)を使用していますか?それは何も証明されませんが、cssのようなリソースは、リフレッシュコンテキストの下で、リソースに完全なフェッチをもたらすコードに組み込まれた304メカニズムなしで再設定されます。 – AnthonyWJones

+0

申し訳ありませんが、もう少し具体的にすべきでした。 私はここに私のヘッダー応答だ、しなければならない再検証の行を削除しました: http://freetexthost.com/zqbddbchvz私は、テキスト/ javascriptのを除いて、まったく同じスクリプトを試すことができている理解していない何 それは200&キャッシュを示しています。 – askon

-1

あなたがパイソン/ジャンゴを読めば、あなたはdjango compressorのコードを読むことができます。複数のCSSファイルを1つにまとめます。 CSS部分は、CSSTidyを起動してCSSをクリーンアップするように見えます。ヘッダのセットにこれを追加

+0

2014-12-03:私は5歳半の答えに立ち寄り、あなたの考えを伝えてくれてありがとう、ありがとう。 – hughdbrown

関連する問題