shur
Давно я тут
  
Репутация: +46/-1
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
Пол: 
Сообщений: 335
|
 |
« Ответ #1 : 06.01.2009, 14:11:11 » |
|
По поводу инструментария - или как и чем это можно проверить и убедиться. Для пользователей Mozilla FireFox будет очень полезно дополнение Web Developer. Это дополнение является отличным набором инструментов для веб-разработчика, среди которых имеется и то, что нам нужно: Web Developer > Information > View Response HeadersПроверяем, тестируем, смотрим не только у себя но и как сделано у других 
|
|
|
|
|
Записан
|
|
|
|
|
lsk
|
 |
« Ответ #2 : 06.01.2009, 14:27:59 » |
|
товарищ, у Вас такая посленовогодняя каша в голове, что даже вопрос сформулировать не можете.
|
|
|
|
|
Записан
|
|
|
|
shur
Давно я тут
  
Репутация: +46/-1
Offline
Пол: 
Сообщений: 335
|
 |
« Ответ #3 : 06.01.2009, 14:34:07 » |
|
товарищ, у Вас такая посленовогодняя каша в голове, что даже вопрос сформулировать не можете.
Вопрос не один их несколько, если вы их не увидели, то ответьте хотябы на этот, почему собственно так: Мне непонятны передаваемые заголовки особенно если учесть что на сайте КЭШ ВКЛЮЧЕН, зачем же тогда запрещать кэш в браузере?
по поводу каши... у меня не каша у меня эээ некоторые пробелы в этой области, о чем и указал, и с новым годом это никак не связано.
|
|
|
|
|
Записан
|
|
|
|
|
lsk
|
 |
« Ответ #4 : 06.01.2009, 14:46:55 » |
|
Правильно сформулированный вопрос - это решение проблемы на 90%.
Мне непонятны передаваемые заголовки особенно если учесть что на сайте КЭШ ВКЛЮЧЕН, зачем же тогда запрещать кэш в браузере? Допустим Вам не понятны заголовки, но при чем здесь кеш? И не надо кеш запрещать. Измените заголовки.
|
|
|
|
|
Записан
|
|
|
|
shur
Давно я тут
  
Репутация: +46/-1
Offline
Пол: 
Сообщений: 335
|
 |
« Ответ #5 : 06.01.2009, 15:07:51 » |
|
Хотелось бы этими заголовками управлять самому, на некоторых сайтах отсутствует функционал который накладывает ограничения на использование кэша браузера (гостевая, комментарии, форум). Для таких сайтов незачем грузить страницы из инета каждый раз когда к ним обращаешься. Хотелось бы задать некоторое время по истечении которого браузер бы обновлял страницу, а так брал бы у себя из кэша.
А так получается: зашел на главную (загрузилась из инета) - перешел в раздел 1 (загрузился из нета) - возвращаешься на главную (опять грузиться из инета). Страницы которые уже были посещены должны открываться практически мгновенно, за исключением выше упомянутых случаев.
|
|
|
|
|
Записан
|
|
|
|
shur
Давно я тут
  
Репутация: +46/-1
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
Пол: 
Сообщений: 1154
Рябов Денис
|
 |
« Ответ #7 : 06.01.2009, 16:00:32 » |
|
global $mainframe; if($mainframe->isAdmin()) { //...//для админки } else { //...//для сайта }
|
|
|
|
|
Записан
|
|
|
|
|
lsk
|
 |
« Ответ #8 : 06.01.2009, 17:19:08 » |
|
shur, может это решение устроит:
http://joomlaforum.ru/index.php/topic,19801.msg294675.html#msg294675
|
|
|
|
|
Записан
|
|
|
|
shur
Давно я тут
  
Репутация: +46/-1
Offline
Пол: 
Сообщений: 335
|
 |
« Ответ #9 : 06.01.2009, 17:30:17 » |
|
А вот это уже реальные ответы  . 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
Пол: 
Сообщений: 335
|
 |
« Ответ #10 : 06.01.2009, 17:34:28 » |
|
Поясните еще одну вещь, вот есть строка: if (JResponse::allowCache() === false) что за параметр allowCache, как он завязан с кэшем Joomla? Завязан ли вообще? Как им управлять?
|
|
|
|
|
Записан
|
|
|
|
|
smart
|
 |
« Ответ #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
Пол: 
Сообщений: 335
|
 |
« Ответ #12 : 06.01.2009, 17:59:55 » |
|
может быть и непонятны, но это не значит, что не логичны...
Именно..., я понимаю что это было сделано не спроста, поэтому и создал эту тему, чтобы выяснить, что да как и в каких ситуациях. Спасибо за ответ все четко сформулировано, а главно понятно. Насколько я знаю некая реализация похожая на описанный метод поведения с ETag уже есть в плагине идущем в составе Joomla - System Cache.
|
|
|
|
|
Записан
|
|
|
|
|
smart
|
 |
« Ответ #13 : 06.01.2009, 18:06:12 » |
|
Не совсем в плагине, но этот функционал действительно уже реализован в классе JCachePage (/libraries/joomla/cache/handler/page.php). Я когда писал ответ, не обратил внимания на раздел и поэтому сначала подумал именно про Joomla 1.0.x. А для старой версии я эту модификацию сделал еще пару лет назад, когда были проблемы с трафиком на Joomlaportal.ru, с тех пор оно и работает там 
|
|
|
|
|
Записан
|
|
|
|
shur
Давно я тут
  
Репутация: +46/-1
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 » |
|
После того как внес изменения, сайт начал быстрее работать!  Но вот подскажите. Как отключить кеширование в модуле CB Login? потому что, юзер логинется, и чтобы он мог норм видеть что он на сайте, ему нужно обновить страницу... Можно ли както сделать, чтобы ето было автоматически, при включеном кеше??? ЗЫ. А можно ли в CB Login, доделать такой прикол, типа, if ($login) происходит действие "ОБНОВИТЬ СТРАНИЦУ".???
|
|
|
|
« Последнее редактирование: 10.04.2009, 14:51:55 от Rocklviv »
|
Записан
|
|
|
|
boreus
Осваиваюсь на форуме
 
Репутация: +5/-0
Offline
Пол: 
Сообщений: 51
|
 |
« Ответ #16 : 30.05.2009, 02:55:40 » |
|
...этот функционал действительно уже реализован в классе JCachePage (/libraries/joomla/cache/handler/page.php).
smart, выходит что описанные тут методы уже реализованы в стандартном функционале 1.5? хотел сначала воспользоваться советом от shur, потому как мне тоже очень нужно снизить нагрузку на сервер. но если это уже есть в Joomla, как этим правильно воспользоваться? проясните, если не трудно
|
|
|
|
|
Записан
|
|
|
|
|