2013-06-25 3 views
0

Я использую этот отличный код рандомизатора, который можно найти здесь: http://alistapart.com/article/randomizer, но изображения не сохраняются в кеше браузера, что означает, что они обновляются каждый раз, когда сайт перезагружается.Кэш-изображения на php-скрипте

Можно ли сохранить изображения в кеше по следующему коду? Причина, по которой я использую этот скрипт, заключается в том, что php-анализ на css по какой-то причине не работает на моем сервере.

<?php 

$folder = '.'; 
$extList = array(); 
    $extList['gif'] = 'image/gif'; 
    $extList['jpg'] = 'image/jpeg'; 
    $extList['jpeg'] = 'image/jpeg'; 
    $extList['png'] = 'image/png'; 

$img = null; 

if (substr($folder,-1) != '/') { 
    $folder = $folder.'/'; 
} 

if (isset($_GET['img'])) { 
    $imageInfo = pathinfo($_GET['img']); 
    if (
     isset($extList[ strtolower($imageInfo['extension']) ]) && 
     file_exists($folder.$imageInfo['basename']) 
    ) { 
     $img = $folder.$imageInfo['basename']; 
    } 
} else { 
    $fileList = array(); 
    $handle = opendir($folder); 
    while (false !== ($file = readdir($handle))) { 
     $file_info = pathinfo($file); 
     if (
      isset($extList[ strtolower($file_info['extension']) ]) 
     ) { 
      $fileList[] = $file; 
     } 
    } 
    closedir($handle); 

    if (count($fileList) > 0) { 
     $imageNumber = time() % count($fileList); 
     $img = $folder.$fileList[$imageNumber]; 
    } 
} 

if ($img!=null) { 
    $imageInfo = pathinfo($img); 
    $contentType = 'Content-type: '.$extList[ $imageInfo['extension'] ]; 
    header ($contentType); 
    readfile($img); 
} else { 
    if (function_exists('imagecreate')) { 
     header ("Content-type: image/png"); 
     $im = @imagecreate (100, 100) 
      or die ("Cannot initialize new GD image stream"); 
     $background_color = imagecolorallocate ($im, 255, 255, 255); 
     $text_color = imagecolorallocate ($im, 0,0,0); 
     imagestring ($im, 2, 5, 5, "IMAGE ERROR", $text_color); 
     imagepng ($im); 
     imagedestroy($im); 
    } 
} 

?> 

ответ

1

Одним из решений является использование куки для хранения изображений, которые вы отправляете к пользователю, и всегда посылают этот образ:

if(!isset($_COOKIE['imgCookie'])) 
{ 
    //runs if the user doesn't have the cookie 
    //run randomizer code 
    //setcookie('imgCookie',$imageNumber); 
} else { 
    //runs if the user already has the cookie 
    $imagenumber=$_COOKIE['imgCookie']; 
} 
//run code for sending image to user 
+0

Есть ли способ сделать это без использования куков? Кроме того, хотя этот код с 2003 года, он отлично работает, но мне было интересно, есть ли более простой способ достичь того же? – lonewulf

+1

Я добавил еще один ответ. – IanPudney

2

Вы можете проинструктировать браузер пользователя кэшировать страницы для очень долгое время (до года, как показано ниже), указав длительность кэширования в заголовке:

header('Cache-Control: max-age=31556926'); 

Есть два предостережения к этому, однако. Во-первых, браузеры не обязательно будут следовать инструкциям кэширования и в любом случае могут загрузить новую копию изображения. Во-вторых, эта строка должна быть размещена где-то на вашей странице до любого контента.

3

Генерация E-tag и Cache-Control заголовок поможет вам как этот

<?php 
    $folder = '.'; 
    $extList = array("gif", "jpg", "jpeg", "png"); 
    $image = false; 

    if (substr($folder, -1) != '/') { 
    $folder = $folder.'/'; 
    } 

    if (isset($_GET["img"])) { 
    $imageExtn = strtolower(pathinfo($_GET["img"], PATHINFO_EXTENSION)); 
    $imageName = basename($_GET["img"]); 
    if (in_array($imageExtn, $extList) && file_exists($folder.$imageName)) { 
     $image = $folder.$imageName; 
    } 
    } 
    else { 
    $fileList = array(); 
    $handle = opendir($folder); 
    while(false !== ($file = readdir($handle))) { 
     $fileExtn = strtolower(pathinfo($file, PATHINFO_EXTENSION)); 
     if (in_array($fileExtn, $extList)) { 
     $fileList[] = $file; 
     } 
    } 
    closedir($handle); 

    if (!empty($fileList)) { 
     $imageNumber = time() % count($fileList); 
     $image = $folder.$fileList[$imageNumber]; 
    } 
    } 

    if ($image !== false) { 
    $contents = implode("", file($image)); 
    $md5 = md5($contents); 
    $mtime = filemtime($image); 
    $etag = etag($md5, $mtime); 

    $r_mtime = 0; 
    $r_etag = null; 

    if (isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])) { 
     $r_mtime = strtotime($_SERVER["HTTP_IF_MODIFIED_SINCE"]); 
    } 
    if (isset($_SERVER["HTTP_IF_NONE_MATCH"])) { 
     $r_etag = trim($_SERVER["HTTP_IF_NONE_MATCH"]); 
    } 

    if ($mtime == $r_mtime && $r_etag == $etag) { 
     header("HTTP/1.0 304 Not Modified", true, 304); 
     header("HTTP/1.1 304 Not Modified", true, 304); 
     header("Content-length: 0"); 
     exit; 
    } 

    header("Content-type: image/".strtolower(pathinfo($image, PATHINFO_EXTENSION))); 
    header("Last-Modified: ".gmdate("D, d M Y H:i:s", $mtime)." GMT"); 
    header("ETag: ".$etag); 
    header("Expires: ".gmdate("D, d M Y H:i:s", time()+3600)." GMT"); 
    header("Cache-Control: max-age=3600"); 
    header("Cache-Control: public"); 

    echo $contents; 
    exit(); 
    } 
    else { 
    if (function_exists("imagecreate")) { 
     header("Content-type: image/png"); 
     $im = @imagecreate(100, 100) or die("Cannot initialize new GD image stream"); 
     $background_color = imagecolorallocate($im, 255, 255, 255); 
     $text_color = imagecolorallocate($im, 0, 0, 0); 
     imagestring($im, 2, 5, 5, "IMAGE ERROR", $text_color); 
     imagepng($im); 
     imagedestroy($im); 
    } 
    } 

    function etag($string_1 = null, $string_2 = null, $quote = true) { 
    $quote = ($quote) ? '"' : ''; 
    $etag = sprintf($quote."%s-%s".$quote, $string_1, $string_2); 
    return $etag; 
    } 
?> 
+0

Кажется, не работает. – lonewulf