Страница 1 из 1

[dev] Клиентское кеширование для фотоальбома от Smartor'а

Добавлено: 03.10.2005 23:55
Егор Наклоняев
Обратил внимание, что при обновлении страницы с миниатюрами из фотоальбома, они каждый раз грузятся заново. Это не есть хорошо.
Предлагается следующее решение
1. Добавляем полезную функцию ExitWithHeader в файл album_mod/album_functions.php

Код: Выделить всё

function ExitWithHeader($output,$message='')
{
	global $db, $HTTP_SERVER_VARS;
	$db->sql_close();
	if(function_exists("getallheaders")) header("HTTP/1.1 $output");
	else header('Status: '.$output);
	$code=intval(substr($output,0,3));
	if(($code==200)||($code==304))
	{
	if(isset($HTTP_SERVER_VARS['HTTP_IF_MODIFIED_SINCE'])) header("Last-Modified: ".$HTTP_SERVER_VARS['HTTP_IF_MODIFIED_SINCE']);
	if(isset($HTTP_SERVER_VARS['HTTP_IF_NONE_MATCH'])) header("Etag: ".$HTTP_SERVER_VARS['HTTP_IF_NONE_MATCH']);
	}
	if(!empty($message)) {
		header ('Content-Type: text/plain');
        echo $message;
	}
	exit;
}
2. В файле album_thumbnail.php
НАЙТИ

Код: Выделить всё

if( empty($thispic) or !file_exists(ALBUM_UPLOAD_PATH . $pic_filename) )
{
	die($lang['Pic_not_exist']);
}
После оного добавить

Код: Выделить всё

       $MyETag='"'.md5($thispic['pic_thumbnail'].$thispic['pic_time']).'"';
       $MyGMTtime=gmdate("D, d M Y H:i:s", $thispic['pic_time'])." GMT";
       if(isset($HTTP_SERVER_VARS['HTTP_IF_NONE_MATCH'])&& ($HTTP_SERVER_VARS['HTTP_IF_NONE_MATCH']== $MyETag)) ExitWithHeader('304 Not Modified');
	   else if(isset($HTTP_SERVER_VARS['HTTP_IF_MODIFIED_SINCE']) && ($HTTP_SERVER_VARS['HTTP_IF_MODIFIED_SINCE'] == $MyGMTtime)) ExitWithHeader('304 Not Modified');
       header("Last-Modified: ".$MyGMTtime);
	   header("Etag: ".$MyETag);
3. Ну, и на закуску, делаем кэширование больших картинок
Открыть файл album_pic.php
Найти

Код: Выделить всё

	   readfile(ALBUM_UPLOAD_PATH  . $thispic['pic_filename']);

exit;
ПЕРЕД ОНЫМ ДОБАВИТЬ

Код: Выделить всё

      
       $MyETag=filectime(ALBUM_UPLOAD_PATH  . $thispic['pic_filename']);
       $MyGMTtime=gmdate("D, d M Y H:i:s", $MyETag)." GMT";
       $MyETag='"'.$MyETag.'"';
       if(isset($HTTP_SERVER_VARS['HTTP_IF_NONE_MATCH'])&& ($HTTP_SERVER_VARS['HTTP_IF_NONE_MATCH']== $MyETag)) ExitWithHeader('304 Not Modified');
	   if(isset($HTTP_SERVER_VARS['HTTP_IF_MODIFIED_SINCE']) && ($HTTP_SERVER_VARS['HTTP_IF_MODIFIED_SINCE'] == $MyGMTtime)) ExitWithHeader('304 Not Modified');
       header("Last-Modified: ".$MyGMTtime);
	   header("Etag: ".$MyETag);
Как мод оформлять лениво, поскольку тот, кому это нужно идею поймет, а объяснять альтернативно одарённым HTTP протокол нет ни времени ни желания.

Добавлено: 04.10.2005 0:37
Siava
Егор Наклоняев
Проверил... опять же, не работает в IE при включеном gzip (вот такая хитрая особенность) :lol:
В Firefox, Opera, (IE при выкл. gzip) etc всё отлично :D

Добавлено спустя 49 секунд:

Спасибо, за весьма полезный мод, мне вот такие мелкие оптимизации жутко необходимы :)

Добавлено: 04.10.2005 0:57
Егор Наклоняев
Siava

Ещё раз проверил. В IE вроде работает тоже, поскольку в HTTP заголовке картинок gzip не упоминается.

Добавлено: 04.10.2005 13:15
Chemist
У меня не работает, причем, как я понимаю в header должен появиться "Etag:", а у меня не появляется.

Re: [dev] Клиентское кеширование для фотоальбома от Smartor'а

Добавлено: 07.06.2008 13:26
Геральт
спасибо. установил - работает. конфигурация : версия 22 + смартор 56 + watermark. Из за ватермарка пришлось отключить кэширование полноразмерных фото, но страницы с миниатюрами просто летают.

Re: [dev] Клиентское кеширование для фотоальбома от Smartor'а

Добавлено: 13.08.2008 15:01
Iftin
Геральт писал(а): Из за ватермарка пришлось отключить кэширование полноразмерных фото, но страницы с миниатюрами просто летают.
ты не стал ставить код для больших картинок?

Re: [dev] Клиентское кеширование для фотоальбома от Smartor'а

Добавлено: 20.08.2008 21:55
Геральт
Iftin писал(а):
Геральт писал(а): Из за ватермарка пришлось отключить кэширование полноразмерных фото, но страницы с миниатюрами просто летают.
ты не стал ставить код для больших картинок?
ага. либо ватермарк либо кэширование (((((