2010-11-23 196 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">