2010-11-23 136 views
2

我有一個類緩存一些圖像PHP緩存問題

<?php 
class Vp_CacheImage 
{ 
    public function cache($cacheTime, $place) // $place = id of image (between 1 and 100) 
    { 
     $send_body = true; 
     $etag = '"' . md5(date('d.m.Y', time()) . $place) . '"'; 
     header("ETag: " . $etag); 
     header("Last-modified: " . gmdate("D, d M Y H:i:s", $cacheTime) . " GMT"); 

     $inm = explode(',', getenv("HTTP_IF_NONE_MATCH")); 
     foreach ($inm as $i) 
     { 
      if (trim($i) == $etag || trim($i) == $cacheTime) 
      { 
       header ("HTTP/1.0 304 Not Modified"); 
       $send_body = false; 
      } 
     } 

     if(getenv("HTTP_IF_MODIFIED_SINCE") == gmdate("D, d M Y H:i:s", $cacheTime). " GMT") 
     { 
      header ("HTTP/1.0 304 Not Modified"); 
      $send_body = false; 
     } 

     header("Expires: " . gmdate("D, d M Y H:i:s", time() + Config::$config['cache']['images']['topvideo']) . " GMT"); 
     header("Cache-Control: max-age=" . Config::$config['cache']['images']['topvideo'] . ", must-revalidate"); 
     if ($send_body) return true; else return false; 
    } 
} 

它的工作原理。但是我必須有時重新加載一張圖片,而不是從緩存中取出。怎麼做?

回答

2

然後,您必須首先從緩存中刪除它,或者..添加臨時文件。隨機令牌,如:?x=234後面並重新加載它。

您也可以在重新加載之前設置過期時間,但這很棘手。

+0

`您還可以設置過期要重新加載它的權利之前的那一刻,但是這tricky.`可能是不可能的,而你可能當你需要重新加載它不知道。 – 2010-11-23 19:47:03

0

你可以簡單地附加一個版本的圖片網址?例如:?myimage.jpg V = 10

這樣做會導致瀏覽器請求圖像的一個新的副本,而不是使用緩存的一個。

0

強制瀏覽器再次獲取圖像的最簡單方法是將一個查詢字符串追加到文件名的末尾。

例如<img src="/assets/images/abc.png?v2">