4

キャッシングで困っている...

このphpファイルをURL書き換えで使用して、cssとjsを圧縮してキャッシュします

ファイルの 1 つを変更または更新すると、ブラウザが更新されたファイルを取得するという印象を受けました。しかし、キャッシュをクリアするか、ページを更新しない限り、そうではありません。

私のコーディングは間違っていますか?それとも、ブラウザはキャッシュの有効期限が切れるまで更新されたコンテンツを取得しないと想定していますか?

<?php
$file = $_SERVER['DOCUMENT_ROOT'].'/'.$_GET['file'];
$last_modified_time = filemtime($file);
$etag = md5_file($file);
$expires = 60*60*24*7;

if(file_exists($file))
{
    if($_SERVER['HTTP_IF_NONE_MATCH'] != $etag)
    {   
        header("Pragma: public");
        header("Cache-Control: maxage=$expires, must-revalidate");
        header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expires) . ' GMT');
        header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT");
        header("Etag: \"{$etag}\"");

        if($_GET['type'] == 'js')  header('Content-type: application/javascript');
        if($_GET['type'] == 'css') header('Content-type: text/css');
        if($_GET['type'] == 'ico') header('Content-type: image/x-icon');

        ob_start("ob_gzhandler");       
        include($file);     
    }
    else {

        header('HTTP/1.0 304 Not Modified');
    }
}
else {

    header("HTTP/1.0 404 Not Found");
}
?>

ルールを書き換える

RewriteRule ^(.*).js$ /compress.php?file=$1.js&type=js [L,QSA]
RewriteRule ^(.*).css$ /compress.php?file=$1.css&type=css [L,QSA]
RewriteRule ^(.*).ico$ /compress.php?file=$1.ico&type=ico [L,QSA]    

----------

編集:多分私はこれを別の方法でやるべきですか?大企業はキャッシュに何を使用し、キャッシュの有効期限が切れる前にブラウザーに更新されたコンテンツを取得させるにはどうすればよいでしょうか?

編集2:助けてくれてありがとう。私は1時間のキャッシュで行きます

4

3 に答える 3

6

Expires指定されたヘッダーの有効期限が切れるまで、ブラウザーはキャッシュされたファイルを更新しません。If-None-Match有効期限が切れている場合は、ヘッダー付きのファイルを要求します(推測します)。

しかし、なぜ を介してキャッシュ制御を処理しなかったのです.htaccessか? あなたはチェックすることができますmod_expires

# Expires-Header
ExpiresActive On
ExpiresByType application/javascript "access plus 7 days"
ExpiresByType text/css "access plus 7 days"

# ETag
FileETag All

Gzip圧縮も次のようにmod_deflate

AddOutputFilterByType DEFLATE text/css application/javascript

編集:「大企業」はヘッダーを使用しないExpiresmax-age、これらのヘッダーを設定してファイルを最大 1 時間キャッシュできるようにします -> キャッシュとの競合が最小限に抑えられます。1 週間に設定しています。

于 2011-08-03T20:42:47.110 に答える
1

あなたはこれらの部分を見逃していると思います...

    $last_modified = filemtime($file);

    // Check for cached version
    if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) OR isset($_SERVER['HTTP_IF_NONE_MATCH'])) 
    {
        // these part should do that...
        if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == gmdate('D, d M Y H:i:s \G\M\T', $last_modified)) 
        {
            header('HTTP/1.0 304 Not Modified');
            return;
        }
    }   
    header('Last-Modified : '.gmdate('D, d M Y H:i:s \G\M\T', $last_modified));
    header('Cache-Control : max-age='.$expires.', must-revalidate');
    header('Expires : '.gmdate('D, d M Y H:i:s \G\M\T', $last_modified + $expires));
    // and so on...

ところで、キャッシュのパフォーマンス、さらにはアプリ全体のパフォーマンスに関連する多くのことを判断するのに役立つように、Google API のパフォーマンスまたはこれらのサイトを使用してテストできます: http://www.webpagetest.org/ ( PS: 例として、これらは私の作業中のブログの最新の結果です: http://www.webpagetest.org/result/110803_SB_17PVH/ )

于 2011-08-03T20:50:29.673 に答える
0

はい、理論的には、ブラウザはあなたが送り返す 、 などの情報に注意を払うべきですが、実際には、ブラウザが正しいことをすると信頼するのは必ずしも良い考えではありませCache-Controlん。Expires

検討したいことは、compress.phpスクリプトに2番目のステップを追加することです...実際の圧縮ファイルへのリダイレクトを行い、"?ts=".$last_modified_timeファイルへのパスに次のようなものを追加します。そうすれば、ファイルが変更されたときに URL が変更され、ブラウザが正しいことを実行して最新のファイルを取得する可能性が高くなります。私は以前に同様のテクニックを使用したことがあります。

于 2011-08-03T20:35:59.053 に答える