0

I have a PHP file get_css.php which generates CSS code more than 60 KB long. This code does not change very often. I want this code to be cached in user's browser. Now, when i visit a HTML page several times which includes get_css.php url to fetch css, my browser is loading all CSS contents from the server each time i visit the page.

Browsers should get the contents from server only if the CSS code is changed on server side. If the css code is not changed, browser will use the css code from the browser cache. I cannot use any PHP function which is not allowed in Server Safe Mode.

Is it possible? How can i achieve this?

4

4 に答える 4

1

クライアントにキャッシュの再検証を簡単に強制することはできません。

可変クエリ文字列をそのリソースに設定すると、プロキシではうまく機能しませんが、ブラウザーでは十分に機能するようです。ブラウザーは、クエリ文字列が変更された場合にのみ css ファイルを再ダウンロードする傾向があります。

 <link rel="stylesheet" type="text/css" href="/get_css.php?v=1.2.3"> 

数値を追加するなど、CSS の命名をいじることができる可能性がありますが、これは優れた代替手段ではありません。

于 2012-11-22T07:54:31.317 に答える
1

PHP からブラウザーの動作を制御することはできませんが、HTTP コードを使用してブラウザーに何かを伝えることができます。

304 Not ModifiedCSS が変更されていない場合は、応答コードを返信してください。

if ($css_has_not_changed && $browser_has_a_copy) {
    http_response_code(304);
} else {
    // regenerate CSS
}

このように、ブラウザードキュメントを要求しますが (これは制御できません)、キャッシュされたコピーを使用するように指示します。

もちろん、これにはテストが必要です。ブラウザーがファイルを「初めて」要求したときにどのように機能するかがわかったからです (おそらく、要求ヘッダーで詳細がわかります)。簡単な firebug テストにより、Firefox がCache-Control: no-cache新しいコピーを要求しているCache-Control: max-age=0とき、およびキャッシュがあるときに要求することが明らかになりました。

于 2012-11-22T08:35:18.977 に答える
0

このようにget_css.phpを含める場合は、通常のGETパラメータを追加します

<link rel="stylesheet" type="text/css" href="get_css.php?v=1">

ブラウザはそれが新しいリンクであると見なし、再度ロードします。

get_css.phpでは、これを使用してブラウザのキャッシュデータを作成します

<?php
header("Content-type: text/css");
header('Cache-Control: public');
header('Expires: ' . gmdate('D, d M Y H:i:s', strtotime('+1 year')) . ' GMT');
ob_start("ob_gzhandler");

//echo css here
于 2012-11-22T07:40:00.010 に答える
0

ブラウザーはデフォルトでドキュメントをキャッシュしようとしますが、それを可能にするために十分な情報を提供する必要があります。Last-Modifiedかなり簡単な方法の 1 つは、スクリプトが最後に変更された日時を含むヘッダーを送信することです。また、ブラウザの「再検証」リクエストを正しく処理する必要があります。受信Last-Modified日を確認し、それをスクリプトの実際の変更日と比較し304 Not Modified、ファイルが変更されていない場合はレスポンスを返します (レスポンス本文は空です)。

また、サーバーが他の「キャッシュなし」ディレクティブを「魔法のように」送信していないことを確認することもお勧めします。これを行う最も簡単な方法はCache-Control、期待する動作をブラウザに正確に伝えるディレクティブを送信することです。

ここでCache-Controlは、各オプションについて簡単に説明します。

次のようなものがうまくいくはずです:

<?php
// this must be at the top of your file, no content can be output before it

$modified = filemtime(__FILE__);
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
  $if_modified_since=strtotime($_SERVER["HTTP_IF_MODIFIED_SINCE"]);
  if( $modified > $if_modified_since ) {
    header('HTTP/1.0 304 Not Modified');
    exit();
  }
}
header('Cache-Control: must-revalidate');
header('Last-Modified: '.date("r",$modified));

// ... and the rest of your file goes here...

上記の例は、例に大きく基づいており、ここに記載されています。

于 2012-11-22T15:29:33.507 に答える