0

サーバー上で PHP を使用して image.png の形式で画像を生成するスクリプトがあります。次に、を使用してこの画像をさまざまな場所で使用して<img src="http://domain.com/images/image.png" />います。

私が直面している問題は、画像が 30 分ごとに再生成されているにもかかわらず、キャッシュされているように見え、http://domain.com/images/image.pngに移動するまで新しい値が表示されないことです。そしてctrl+shift+refresh

イメージ名を同じままにして、常に最新バージョンのイメージを表示する方法はありますか?

4

3 に答える 3

5

これは、ブラウザによって 30 分以上キャッシュされているために発生しています。画像は 30 分ごとに生成されるため、それに応じてヘッダーを設定する必要がExpiresCache-controlあります。

これらのヘッダーを参照してください。

Expires: Mon, 10 Dec 2012 16:25:18 GMT
Cache-Control: max-age=1800

ここでExpriesは、現在から 30 分後の時刻に設定されています ( Date: Mon, 10 Dec 2012 15:55:18 GMT)。またCache-Control、設定する必要があります。単位はここでは 2 番目です。

これらのヘッダーを、キャッシュ期間が 60 分の画像生成サイトに使用します。これらは、キャッシュするために従うルールです。

  1. 画像ファイルが存在するかどうかを確認する
    • キャッシュ期間よりも古い場合は、それを削除してから新しいイメージを生成します。
  2. 画像ファイルが存在しない場合
    • 画像を生成して保存する
  3. これで有効な画像ができました。
  4. 画像のファイル変更日を計算し、それにキャッシュ期間を追加します。
  5. 有効期限がステップ 4 で計算した値になる適切なヘッダーを付けて提供します。
于 2012-12-10T15:57:00.953 に答える
4

状況に応じて、いくつかのオプションがあります。「images/image.png」がサーバー上の実際のファイルであり、直接アクセスしている場合は、フォルダーのキャッシュ設定を変更するか、.htaccess を使用してブラウザーに再送信するよう通知する必要があります。

<FilesMatch "\.(ico¦pdf¦flv¦jpg¦jpeg¦png¦gif¦js¦css¦swf)$">
ExpiresDefault A604800
Header set cache-control: "no-cache, public, must-revalidate"
</FilesMatch> 

PHP を使用して画像を検索して返す場合は、PHP を使用してヘッダーを送信できます。

header("Expires: ".gmdate("D, d M Y H:i:s", time()+1800)." GMT");
header("Cache-Control: max-age=1800");

PHPで完全に行うには、実際に変更されているかどうかを確認できます

$last_modified_time = @filemtime($file);
header("Expires: ".gmdate("D, d M Y H:i:s", $last_modified_time+1800)." GMT"); 
//change with $last_modified_time instead of time().
//Else if you request it 29mins after it was first created, you still have to wait 30mins
//but the image is recreated after 1 min.

header("Cache-Control: max-age=1800");
header("Vary: Accept-Encoding");

// exit if not modified
if (array_key_exists('HTTP_IF_MODIFIED_SINCE', $_SERVER)) {
    if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time) { 
        header("HTTP/1.1 304 Not Modified"); 
        return;
    }
}
于 2012-12-10T15:57:28.943 に答える
0

PHP を使用して画像を読み込もうとすることができます。

<?php
//generateImage.php

$path = "xxxx/xxx.jpg";
$img =imagecreatefromjpeg($path);

header("Content-Type: image/jpeg");
imagejpeg($img);
imagedestroy($img);

?>

そして、次のように画像を呼び出します。

<img src="http://domain.com/generateImage.php" />
于 2012-12-10T15:55:58.113 に答える