как устранить проблему связанную с просмотром новости к примеру у которой прикрепленные изображения!
проблема в том что они не кэшатся! каждый раз читая новость повторно открывая страницу происходит обращение в систему для отдачи изображения!
как заставить систему работать по принципу один раз сгенел картинку системой, отдать ее в кэш браузера чтоб до следующего обновления страницы или изображения обращения на систему не происходило!?
Alexander
2011-03-15, 16:33
хмм... Хорошая идея на самом деле. Запишу себе для реализации в альфе.
По вопросу. Наверное самое простое - установить какой-нибудь сервер статики nginx. На RC5 такая возможность, к сожалению, не предусмотрена. Но, как сказал выше, в первой версии будет 100%.
ок буду ждать... пока поковыряюсь сам +)
Всмысле сохранить в кеше?? Браузер это должен делать по умолчанию. Ну или только у меня так)
Alexander
2011-03-16, 3:50
KeSSLeR, он это может делать только в случае если его попросят. Если его не просить - кэшировать он ничего не будет.
Первую версию уже научил кэшировать. Следите за обновлениями.
Цитата (Alexander @ 2024-04-26 09:15)
Первую версию уже научил кэшировать
это отлично!!!
Александр как вы научили кешить картинки, интересует для РЦ5, в хеде вы там вообще отменили кешь всего чего только можно.
если учидють так
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.date('r',$this->MyTime()-3600));
#header('Cache-Control: no-store, no-cache, must-revalidate');#HTTP/1.1
#header('Cache-Control: post-check=0, pre-check=0',false);
#header('Pragma: no-cache');#HTTP/1.0
header('Content-Type: image/jpg');
header('Content-Type: '.$this->content_type.'; charset='.$charset);
header('Content-Encoding: '.($this->do_gzip_compress ? 'gzip' : 'none'));
то всё кешиться кашерно, но вопрос в другом, какие последствия это принесёт ?
Alexander
2011-08-25, 18:51
Djadka, весь секрет кэширования картинок сокрыт в файле download.php . А в остальном, кэширование картинок ничем не отличается от кэширования прочего контента. Технология кэширования широко описана в Интернете.
Ключевые моменты:
header('Cache-Control: max-age=0, must-revalidate');
$_SERVER['HTTP_IF_MODIFIED_SINCE']
Etag
Цитата (Alexander @ 2024-04-26 09:15)
весь секрет кэширования картинок сокрыт в файле download.php
Alexander, а Вы не могли бы и в файл download.php от RC5 внедрить такое же кэширование?
Alexander
2011-08-28, 16:16
Loader, к сожалению нет, поскольку кэширование идет намного дальше файла download.php
Мой вариант что выше берёт все картинка с сайта, включая и шаблон и отсылает дружно в кеш. Загрузка сайта ощутима ускорилась
Цитата (Djadka @ 2024-04-26 09:15)
включая и шаблон
Включая и html-страницы! Зачем это надо?
Не хтмл страницы а включая картинки с шаблона что бы не было нагрузка для сервака каждый раз грузить их
Цитата (Djadka @ 2024-04-26 09:15)
Не хтмл страницы а включая картинки с шаблона что бы не было нагрузка для сервака каждый раз грузить их
А как быть с этим участком:
Цитата
header('Content-Type: image/jpg');
header('Content-Type: '.$this->content_type.'; charset='.$charset);
Сначала хеадер Content-Type: image/jpg а потом он перезаписывается чем угодно.
Добавлено через 2 минут, 0 секунд:Цитата (Alexander @ 2024-04-26 09:15)
Loader, к сожалению нет, поскольку кэширование идет намного дальше файла download.php
Не намного дальше на самом деле. Функцию
HookOutPut() можно реализовать и прямо в файле download.php.
Alexander
2011-08-28, 21:17
Цитата (Loader @ 2024-04-26 09:15)
Не намного дальше на самом деле. Функцию HookOutPut() можно реализовать и прямо в файле download.php.
Давайте я Вам помогу - а Вы реализуете и выложите на всеобщее благо. Сейчас у меня очень критично со временем.
Цитата (Alexander @ 2024-04-26 09:15)
Давайте я Вам помогу - а Вы реализуете и выложите на всеобщее благо. Сейчас у меня очень критично со временем.
Да я только "ЗА"!
Alexander
2011-08-28, 21:43
Окей. Попробуйте самостоятельно разобраться в заголовках. Задавайте здесь вопросы - я буду отвечать. И все у нас получится.
Цитата (Alexander @ 2024-04-26 09:15)
Окей. Попробуйте самостоятельно разобраться в заголовках.
В общем-то разобрался, кэшируется отлично
Для включения этой полезной опции нужно сделать следующее: скачать приложенный архив, заменить файл download.php в корне сайта и кое-что изменить. Во-первых скопировать текст из файла
class_funtions.txt и вставить его в файл
classes/class_functions.php вместо функции
public static function OutputStream($text,$filename=''), затем копируете текст из файла
mainclass.txt и вставляете в файл
classes/mainclass.php перед функцией
public function SendHeaders($charset=ELEANOR_DISPLAYCHARSET).
Вот и всё!
Обновление и устранение кое-каких недочётов.
Если Вы устанавливали данный пример из предыдущего поста, то вам нужно вернуть всё в первоначальное состояние. (как было до установки)
Для установки нужно открыть файл
classes/mainclass.php найти в нём строку примерно 433 с текстом:
Цитата
foreach($this->ip_arr as &$ip)
if(Functions::IPMatchMask($ip,$b_ip))
throw new EE($message,EE::BAN);
}
}
///Место вставки кода
public function SendHeaders($charset=ELEANOR_DISPLAYCHARSET)
{
if(headers_sent())
return;
и вставить там следующий код:
Цитата
// $last_modified - дата последней модификации документа на сервере, Unix Timestamp
// $etag = текущий ETag документа на сервере
public function NeedRefresh($last_mod,$etag)
{
if(headers_sent()) return; $refresh=true;
$mod_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? strtotime(preg_replace("/;.*$/", "", $_SERVER["HTTP_IF_MODIFIED_SINCE"])) : '';
$none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : '';
switch (TRUE) {
case (!$none_match && $mod_since): #Проверка только по If-Modified-Since:
if ($mod_since <= time() && is_int($mod_since) && $mod_since >= $last_mod) $refresh=false; # 304 Not Modified
break;
case ($none_match):
if ($mod_since)
{ # Проверка и по If-None-Match, и по If-Modified-Since
if ($mod_since > time() || !is_int($mod_since) || $mod_since < $last_mod)
break; # Файл в кэше клиента устарел по If-Modified-Since
}
# Проверку If-Modified-Since, если она была - прошли. Проверка по If-None-Match:
if ($etag == '') { $etag=dechex($last_mod); break; }
$INM = split('[,][ ]?', $none_match);
foreach ($INM as $enity)
if ($enity==$etag || $enity=='*') $refresh=false; # 304 Not Modified
break;
# Если после этого $refresh=true то просто отдаем страницу.(200 ОК)
}
header('ETag: '.$etag);
if ($refresh)
{
header('Last-Modified: '.gmdate('D, d M Y H:i:s ',$last_mod).'GMT');
return;
}
header('Last-Modified: '.gmdate('D, d M Y H:i:s ',$last_mod).'GMT',true,304);
die;
}
Далее нужно скачать приложеный архив, из которого взять файлы:
1) заменить файл
download.php в корне сайта;
2) скопировать файл
class_files.php в папку
classes/others/ на Вашем сайте;
Всё, теперь файлы из папки uploads включая картинки кэшируются в браузере.
Alexander
2011-09-23, 23:18
Loader, благодарю за проделанную работу!
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.