LiveInternetMail.ru
Форум русской поддержки Joomla!® CMS
27.05.2012, 23:56:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 1.7 FAQ Joomla 1.5 FAQ Joomla 1.0 FAQ Правила форума Новости Joomla Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор Тема: Оптимизация Joomla 1.5 - Response Headers  (Прочитано 7314 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
shur
Давно я тут
****

Репутация: +46/-1
Offline Offline

Пол: Мужской
Сообщений: 335



« : 05.01.2009, 23:37:37 »

Response Headers - заголовки ответа (кого чему) удаленного сервера браузеру, несущие в себе информацию об управлении кэшем на стороне браузера (кэшировать страницу или нет), время последней модификации, время жизни кэша, по истечении которого страница будет заново загружена из инета и т.д.

Есть хорошая статья на эту тему на русском Кэширование в HTTP

Решил проверить как обстоят дела в Joomla 1.5 с этим делом на реальном сайте, а заоодно и для себя закрыть некоторые пробелы в данной области.
Что выяснилось, что включенном кэше в joomla и даже при включенном системном плагине System - Cache заголовки передаются такие:
Код:
Expires: Mon, 1 Jan 2001 00:00:00 GMT
Last-Modified: Mon, 05 Jan 2009 18:55:28 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Expires: Mon, 1 Jan 2001 00:00:00 GMT — этот заголовок устанавливает время актуальности информации. Joomla передат дату в прошлом, полагая, что это заставит браузер каждый раз загружать страницу с сервера. Оказывается это не работает.
Last-Modified: Mon, 05 Jan 2009 18:55:28 GMT — дата и время изменения информации на странице. Здесь вообще передается ТЕКУЩАЯ дата вместо РЕАЛЬНОЙ даты изменения документа.
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 — именно этот заголовок управляет кэшированием, но не сам, а в совокупности с другими. Сейчас здесь говориться «использовать информацию следующего запроса без повторной проверки на исходном сервере нельзя».
Pragma: no-cache — устаревший заголовок.

Мне непонятны передаваемые заголовки особенно если учесть что на сайте КЭШ ВКЛЮЧЕН, зачем же тогда запрещать кэш в браузере?
Это же существенно замедляет работу с сайтом, зачем например загружать главную страницу из инета, каждый раз когда на нее возвращаешься при пользовании сайтом, почему не брать из кэша? Я уже не говорю о том, что это приводит к возрастанию нагрузки на ваш сервер и интернет канал.

Что я хочу?
да сообственно внести ясность и разрулить все это общими усилиями.

Приветствуются ссылки на ресурсы, информацию и инструменты по теме.


« Последнее редактирование: 06.01.2009, 14:11:41 от shur » Записан
shur
Давно я тут
****

Репутация: +46/-1
Offline Offline

Пол: Мужской
Сообщений: 335



« Ответ #1 : 06.01.2009, 14:11:11 »

По поводу инструментария - или как и чем это можно проверить и убедиться.
Для пользователей Mozilla FireFox будет очень полезно дополнение Web Developer.

Это дополнение является отличным набором инструментов для веб-разработчика, среди которых имеется и то, что нам нужно:
Web Developer > Information >  View Response Headers

Проверяем, тестируем, смотрим не только у себя но и как сделано у других Wink
Записан
lsk
Завсегдатай
*****

Репутация: +12/-4
Offline Offline

Сообщений: 432



« Ответ #2 : 06.01.2009, 14:27:59 »

товарищ, у Вас такая посленовогодняя каша в голове, что даже вопрос сформулировать не можете.
Записан
shur
Давно я тут
****

Репутация: +46/-1
Offline Offline

Пол: Мужской
Сообщений: 335



« Ответ #3 : 06.01.2009, 14:34:07 »

товарищ, у Вас такая посленовогодняя каша в голове, что даже вопрос сформулировать не можете.
Вопрос не один их несколько, если вы их не увидели, то ответьте хотябы на этот, почему собственно так:
Мне непонятны передаваемые заголовки особенно если учесть что на сайте КЭШ ВКЛЮЧЕН, зачем же тогда запрещать кэш в браузере?

по поводу каши... у меня не каша у меня эээ некоторые пробелы в этой области, о чем и указал, и с новым годом это никак не связано.
Записан
lsk
Завсегдатай
*****

Репутация: +12/-4
Offline Offline

Сообщений: 432



« Ответ #4 : 06.01.2009, 14:46:55 »

Правильно сформулированный вопрос - это решение проблемы на 90%.

Мне непонятны передаваемые заголовки особенно если учесть что на сайте КЭШ ВКЛЮЧЕН, зачем же тогда запрещать кэш в браузере?
Допустим Вам не понятны заголовки, но при чем здесь кеш? И не надо кеш запрещать. Измените заголовки.
Записан
shur
Давно я тут
****

Репутация: +46/-1
Offline Offline

Пол: Мужской
Сообщений: 335



« Ответ #5 : 06.01.2009, 15:07:51 »

Хотелось бы этими заголовками управлять самому, на некоторых сайтах отсутствует функционал который накладывает ограничения на использование кэша браузера (гостевая, комментарии, форум).
Для таких сайтов незачем грузить страницы из инета каждый раз когда к ним обращаешься. Хотелось бы задать некоторое время по истечении которого браузер бы обновлял страницу, а так брал бы у себя из кэша.

А так получается: зашел на главную (загрузилась из инета) - перешел в раздел 1 (загрузился из нета) - возвращаешься на главную (опять грузиться из инета). Страницы которые уже были посещены должны открываться практически мгновенно, за исключением выше упомянутых случаев.
Записан
shur
Давно я тут
****

Репутация: +46/-1
Offline Offline

Пол: Мужской
Сообщений: 335



« Ответ #6 : 06.01.2009, 15:16:22 »

За формирование заголовков в Joomla 1.5 отвечает файл libraries\joomla\environment\response.php

в нем есть следующие строки:
Код:
if (JResponse::allowCache() === false)
{
JResponse::setHeader( 'Expires', 'Mon, 1 Jan 2001 00:00:00 GMT', true ); // Expires in the past
JResponse::setHeader( 'Last-Modified', gmdate("D, d M Y H:i:s") . ' GMT', true ); // Always modified
JResponse::setHeader( 'Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', false );
JResponse::setHeader( 'Pragma', 'no-cache' ); // HTTP 1.0
}

Вносим в него изменения:
Внимание код не использовать на рабочих сайтах, так как создает проблемы в работе админки

Код:
if (JResponse::allowCache() === false)
{
// Включение кэширования на 30 мин
JResponse::setHeader('Cache-Control', 'public');
JResponse::setHeader('Expires', date("r", time() + 1800));
}

и вуаля сайт начинает кэшироваться браузером, работа с сайтом превращается в сказку - сайт летает.

НО ВСЕ ЭТО НАЧИНАЕТ ОТРАЖАТЬСЯ И НА АДМИНКЕ, в которой кэширование браузера должно быть запрещено.
Подскажите как это разграничить, т.е. для лицевой части сайта одни заголовки, для админки другие.
Записан
Physicist
Support Team
*****

Репутация: +179/-0
Offline Offline

Пол: Мужской
Сообщений: 1154


Рябов Денис


« Ответ #7 : 06.01.2009, 16:00:32 »

global $mainframe;
if(
$mainframe->isAdmin())
{
//...//для админки
}
else
{
//...//для сайта
}
Записан
lsk
Завсегдатай
*****

Репутация: +12/-4
Offline Offline

Сообщений: 432



« Ответ #8 : 06.01.2009, 17:19:08 »

shur, может это решение устроит:

http://joomlaforum.ru/index.php/topic,19801.msg294675.html#msg294675
Записан
shur
Давно я тут
****

Репутация: +46/-1
Offline Offline

Пол: Мужской
Сообщений: 335



« Ответ #9 : 06.01.2009, 17:30:17 »

А вот это уже реальные ответы  Smiley.

Physicist
Спасибо попробовал, работает на моем конкретном сайте, делал так - подкорректировал функцию согласно подсказке:
Код:
function toString($compress = false)
{
global $mainframe;
$data = JResponse::getBody();

// Don't compress something if the server is going todo it anyway. Waste of time.
if($compress && !ini_get('zlib.output_compression') && ini_get('output_handler')!='ob_gzhandler') {
$data = JResponse::_compress($data);
}

if (JResponse::allowCache() === false)
{
if(!$mainframe->isAdmin()) {
// Включение кэширования на 30 мин
JResponse::setHeader('Cache-Control', 'public');
JResponse::setHeader('Expires', date("r", time() + 1800));
} else {
JResponse::setHeader( 'Expires', 'Mon, 1 Jan 2001 00:00:00 GMT', true ); // Expires in the past
JResponse::setHeader( 'Last-Modified', gmdate("D, d M Y H:i:s") . ' GMT', true ); // Always modified
JResponse::setHeader( 'Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', false );
JResponse::setHeader( 'Pragma', 'no-cache' ); // HTTP 1.0
}
}

JResponse::sendHeaders();
return $data;
}

В итоге сайт кэшируется, админка нет, то что и требовалось. Пока еще локально, сейчас тестю и в сразу в on-line.

lsk
Спасибо за ссылку, ща посмотрю что да как.
Записан
shur
Давно я тут
****

Репутация: +46/-1
Offline Offline

Пол: Мужской
Сообщений: 335



« Ответ #10 : 06.01.2009, 17:34:28 »

Поясните еще одну вещь, вот есть строка:
Код:
if (JResponse::allowCache() === false)
что за параметр allowCache, как он завязан с кэшем Joomla? Завязан ли вообще?
Как им управлять?
Записан
smart
Администратор
*******

Репутация: +1143/-14
Offline Offline

Пол: Мужской
Сообщений: 8204


тружусь даже во сне...


« Ответ #11 : 06.01.2009, 17:44:31 »

Мне непонятны передаваемые заголовки особенно если учесть что на сайте КЭШ ВКЛЮЧЕН, зачем же тогда запрещать кэш в браузере?
может быть и непонятны, но это не значит, что не логичны... в настройках сайта включается серверное кэширование результатов выборки данных и генерации кусков html-кода для вывода, что и позволяет снизить нагрузку на сервер, а данные заголовки, отвечают за браузерное кэширование страницы.

Разница вот в чем. Если включено кэширование на сервере, то когда 100 пользователей запросят страницу, то основная масса запросов и процессов выполнится всего 1 раз, и в этом экономия серверных ресурсов.

Если дополнительно включить кэширование на стороне клиента (в браузере, посредством установки упомянутых заголовков), безусловно, это сократит объем передаваемой информации, но, если делать так, как написали вы, будут проблемы. И не только в административной панели. Дело в том, что главная (или какая иная страница) далеко не всегда бывает статичной. Может быть в вашем конкретном случае не важно, но на странице могут быть модули выводящие, к примеру, последние комментарии. И пойдя по предложенному вами пути, вы будете в течении получаса видеть старую страницу.

Более правильно не устанавливать принудительное кэширование страницы, а вычислять хэш страницы, помещая его в поле ETag. А на серверной стороне, анализировать хэш страницы с переданным в запросе и если данные не изменились - возвращать 304 код ошибки. Это позволяет и уменьшить трафик, и быть более честными по отношению к поисковикам (т.е. сразу сознаваться им, что ничего не менялось), и не лишать пользователя шанса видеть актуальную страницу, а не часовой давности или там полугодичной.

p.s. Кстати статья, упомянутая вами, очень далека от совершенства. И я бы сказал несколько однобока...
p.p.s. вот, как мне кажется, более интересная статья: Слежение за контентом на динамических сайтах и вот GET-запрос с условием (Conditional GET).
« Последнее редактирование: 06.01.2009, 17:51:40 от smart » Записан
shur
Давно я тут
****

Репутация: +46/-1
Offline Offline

Пол: Мужской
Сообщений: 335



« Ответ #12 : 06.01.2009, 17:59:55 »

может быть и непонятны, но это не значит, что не логичны...
Именно..., я понимаю что это было сделано не спроста, поэтому и создал эту тему, чтобы выяснить, что да как и в каких ситуациях.
Спасибо за ответ все четко сформулировано, а главно понятно.

Насколько я знаю некая реализация похожая на описанный метод поведения с ETag уже есть в плагине идущем в составе Joomla - System Cache.
Записан
smart
Администратор
*******

Репутация: +1143/-14
Offline Offline

Пол: Мужской
Сообщений: 8204


тружусь даже во сне...


« Ответ #13 : 06.01.2009, 18:06:12 »

Не совсем в плагине, но этот функционал действительно уже реализован в классе JCachePage (/libraries/joomla/cache/handler/page.php).

Я когда писал ответ, не обратил внимания на раздел и поэтому сначала подумал именно про Joomla 1.0.x. А для старой версии я эту модификацию сделал еще пару лет назад, когда были проблемы с трафиком на Joomlaportal.ru, с тех пор оно и работает там Azn
Записан
shur
Давно я тут
****

Репутация: +46/-1
Offline Offline

Пол: Мужской
Сообщений: 335



« Ответ #14 : 06.01.2009, 18:19:52 »

Под Joomla 1.0 на этом форуме уже предложено куча всевозможных решений, если они чем то не подходят, то при определенном рукоприкладстве можно на их основе сделать и свое. C Joomla 1.5 ситуация другаю, почти полное отсутствие инфы.

Эта версия Joomla становится все более актуальной, я и сам уже имею несколько проектов, на которых серьезно начинает расти посещаемость, ну а там где посещаемость там и всплывают вского рода проблемы с оптимизацией, надеюсь не у меня одного, ибо вместе проще проблему решать.
Записан
Rocklviv
Гость
« Ответ #15 : 10.04.2009, 13:47:13 »

После того как внес изменения, сайт начал быстрее работать!  Cheesy Cheesy Cheesy
Но вот подскажите. Как отключить кеширование в модуле CB Login? потому что,  юзер логинется, и чтобы он мог норм видеть что он на сайте, ему нужно обновить страницу...
Можно ли както сделать, чтобы ето было автоматически, при включеном кеше???

ЗЫ. А можно ли в CB Login, доделать такой прикол, типа, if ($login) происходит действие "ОБНОВИТЬ СТРАНИЦУ".???
« Последнее редактирование: 10.04.2009, 14:51:55 от Rocklviv » Записан
boreus
Осваиваюсь на форуме
***

Репутация: +5/-0
Offline Offline

Пол: Мужской
Сообщений: 51


« Ответ #16 : 30.05.2009, 02:55:40 »

...этот функционал действительно уже реализован в классе JCachePage (/libraries/joomla/cache/handler/page.php).

smart, выходит что описанные тут методы уже реализованы в стандартном функционале 1.5?
хотел сначала воспользоваться советом от shur, потому как мне тоже очень нужно снизить нагрузку на сервер.
но если это уже есть в Joomla, как этим правильно воспользоваться?
проясните, если не трудно
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Рейтинг@Mail.ru Rambler Top100 Powered by SMF 1.1.16 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet