Я использую этот отличный код рандомизатора, найденный здесь: http://alistapart.com/article/randomizer , но изображения не сохраняются в кеше браузера, что означает, что они обновляются каждый раз, когда сайт перезагружается.
Можно ли сохранить кеширование изображений в следующем коде? Причина, по которой я использую этот скрипт, заключается в том, что 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); } } ?>
Создание заголовка 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 MYH:i:s", $mtime )." GMT" ); header( "ETag: ".$etag ); header( "Expires: ".gmdate( "D, d MYH: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; } ?>
Вы можете поручить браузеру пользователя кэшировать вашу страницу в течение очень долгого времени (до года, показанного ниже), указав продолжительность кэша в заголовке:
header('Cache-Control: max-age=31556926');
Однако есть два оговорки. Во-первых, браузеры не обязательно будут следовать инструкциям кэширования и в любом случае могут загрузить новую копию изображения. Во-вторых, эта строка должна быть размещена где-то на вашей странице перед любым контентом.
Одним из решений является использование файла cookie для хранения изображения, которое вы отправили пользователю, и всегда отправляйте это изображение:
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