Xpoint
   [напомнить пароль]

Вычисление Last-Modified для динамического сайта

Метки: [без меток]
2006-02-15 15:21:58 [обр] Rom McRitsky(0/441)[досье]

Прошу высказаться по поводу вычисления значения Last-Modified для динамического сайта.

Имеем:

  • шаблоны с вёрсткой
  • текстовые динамические блоки
  • механизмы авторизации посетителей

Общий вопрос: как корректно вычислить время последнего изменения сгенерированной страницы?
Конечно, в общем случае - взять максимальную дату изменения среди шаблонов, участвующих в сборке страницы и текстовых блоков.

Но иногда этого не достаточно.

Примеры:

  1. Отключили (деактивировали) промо-блок, который до этого был на странице. Поле timestamp, содержащее дату его изменения, приняло актульное значение. Но при выборке промо-блоков этот блок не попал в результат SQL-запроса по причине своей неактивности, и дата его изменения учтена не будет.
  1. Человек залогинился на сервере. Где-то в уголке висит сообщение "Добро пожаловать, username". Это уже изменения на странице, пусть и незначительные - но изменения. Стоит ли менять Last-Modified ?

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

      list($date)=mysql_fetch_row($res=mysql_query("SELECT lm FROM lm WHERE url='".mysql_escape_string($_SERVER['REQUEST_URI'])."' AND hash = '{$hash}'"));
      mysql_free_result($res);
      if(!$date)
   mysql_q("REPLACE INTO lm(url, hash, lm) VALUES('".mysql_escape_string($_SERVER['REQUEST_URI'])."', '{$hash}', '".($date=date("r"))."')");
      header("Last-Modified: {$date}");

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

Хотел бы посоветоваться со знатоками: как корректно высчитывать Last-Modified в случае динамического создания страниц.

спустя 5 часов [обр] Сергей Круглов(33/2057)[досье]

Я беру максимальный last-modified всех разделов вне зависимости от того, используются ли они при отображении сайта.

Если, конечно, там какой-нить форум не инклюдится или что еще типа этого. В таком случае изменения настолько часты, что дешевле не выдавать last-modified.

спустя 18 часов [обр] wiktar(0/20)[досье]

Как last-modified нужно отдавать last-modified контента, содержащегося на странице (если это статья, например).

Люди ходят за контентом, а не за вспомогательными элементами.

Если это форум - то дату последнего сообщения.

Спорно, да? :)

спустя 4 минуты [обр] Rom McRitsky(0/441)[досье]
Больше желающих высказаться нет?
Или тема настолько неактуальна?
спустя 23 минуты [обр] Алексей Севрюков(0/1280)[досье]

Rom McRitsky[досье] Очень актуальна. Тоже ищу решение, пока стоит текущая дата, планируется отдавать дату изменения контента, без учета изменений других блоков.

А в динамических разделах (где у каждого пользователя своя страница) - высчитывать дату я бы не стал, ставил бы текущую, ИМХО.

P.S. Интересно, а всякий крупняк типа mail.ru, yandex.ru и т.д. в персональных разделах какую дату ставят.

спустя 2 часа 29 минут [обр] Rom McRitsky(0/441)[досье]

Персональные разделы интересуют второстепенно, интересует вопрос в комплексе. Также интересует, как поисковики относятся к страницам, Last-Modified которых не изменился, а размер - да. Такое будет если не принимать во внимание изменение шаблонов и неконтентных блоков.

Алексей Севрюков[досье] Текущая дата - удар по кешированию. Хочется всё делать корректно, в том числе с учётом if-modified-since.

спустя 9 минут [обр] Сергей Круглов(33/2057)[досье]
Ок, выдаем дату изменения основного контента.
Если контент страницы не изменился, а изменились меню / список последних тем с форума / "Сегодня 16 февраля" / дизайн / еще что-нить, то пользователь при повторном заходе никаких изменений рискует не увидеть. И начнет звонить "нерадивому" программисту "а что это у нас дата позавчерашняя на сайте и форум не обновляется". Вам еще не звонили? Тогда мы идем к вам ;)
спустя 2 минуты [обр] Сергей Круглов(33/2057)[досье]

Алексей Севрюков[досье]

P.S. Интересно, а всякий крупняк типа mail.ru, yandex.ru и т.д. в персональных разделах какую дату ставят.

Ну дык Live-HTTP-Headers в руки и вперед ;)

спустя 23 минуты [обр] Даниэль Алиевский(9/125)[досье]

Из спортивного интереса - а чем плох такой вариант? Вообще не ставим Last-Modified (и не отвечаем 304). Но зато пишем Expires на +20 минут. Гарантия, что любой пользователь увидит данные максимум 20-минутной давности. А если нажмет Reload - то самые свежие.

Last-Modified нужен для чего? Для экономии трафика пользователя и трафика/нагрузки сервера. Вероятнее всего, за 20 минут посетитель посмотрит много страниц. Какова вероятность, что посетитель заходит повторно на страницу, на которой он был более 20 минут назад, по сравнению с вероятностью повторного захода в пределах 20-минутного интервала? По-моему, невысока. Если уж я смотрю сайт, то активно хожу по страницам, а потом, вероятно, займусь другими делами (или сайтами). А если так, то Expires даст почти такую же экономию, как и корректный Last-Modified. Статистику, конечно, можно исследовать для конкретного сайта.

При этом, Expires в чем-то лучше Last-Modified: в течение заданного интервала вообще нет обращений к серверу.

спустя 3 часа 11 минут [обр] wiktar(0/20)[досье]

Тогда можно так.

Если у сайта есть система кэширования (т.е. если ничего не изменилось - не бросаться в Базу, не формировать всё заново), то выдавать Last-Modified этого кэшированого документа.

У себя я именно так и сделаю.

Что касается всяких примочек, вроде текущей даты - придётся, конечно, оставлять с ними.

В этом случае показателен пример LiveJournal.com. Там и авторизация есть, и куча сообщений добавляется.

Так вот, он отправляет Last-Modified.

Что может быть проще: если страница не содержит ничего нового - отправить новую.

спустя 2 часа 5 минут [обр] Алексей Севрюков(0/1280)[досье]

Rom McRitsky[досье]

Также интересует, как поисковики относятся к страницам, Last-Modified которых не изменился, а размер - да.

Наш оптимизатор просит меня сделать чтобы Last-Modified отдавался по контенту. В тонкостях не разбираюсь, но если просит, то наверно поисковики относятся к этому положительно или, как минимум, нейтрально.

Текущая дата - удар по кешированию

А Expires и Cache-Control разве не управляют кэшированием? И стоит ли вообще заботится об этом, если, например, страница сайта весит не больше 10-20 кб (графику не считаем, ее отдает сам Apache и с кэшированием здесь все нормально). ИМХО, это акутально только на проектах с весом страницы выше среднего.

спустя 13 часов [обр] Даниэль Алиевский(9/125)[досье]

Алексей Севрюков[досье]

И стоит ли вообще заботится об этом, если, например, страница сайта весит не больше 10-20 кб (графику не считаем, ее отдает сам Apache и с кэшированием здесь все нормально). ИМХО, это акутально только на проектах с весом страницы выше среднего.

Не согласен, стоит. Хотя графика обычно "весит" и больше, но если сайт не совсем тривиален, то посетитель, вероятно, посмотрит не одну страницу. Причем будет возвращаться обратно и идти по другим ссылкам. При этом дизайнерская графика будет, скорее всего, одна и таже. А 25 страниц по 20 KB, скажем, на моем компьютере уже стоят рубль. (По этой же причине всегда полезно gzip-овать.) К тому же, почему 20? Кто сейчас старается укладываться в 20 KB? Медленные модемы - уже экзотика, жертвовать ради них удобством и дизайном вряд ли стоит.

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

Конечно, если сайт популярен, то встает еще вопрос экономии трафика на стороне сервера. Миллион страниц в день по 20 KB или два миллиона при плохом кэшировании - вполне ощутимая разница.

спустя 21 минуту [обр] Алексей Севрюков(0/1280)[досье]
Даниэль Алиевский[досье] Я с Вами согласен. Но зависит опять же от проекта. Если проект крупный, то это конечно все актуально и имеет смысл тратить время на реализацию этой фичи. ИМХО.
спустя 53 минуты [обр] Антон Клесс(0/25)[досье]
...а также читаем последнюю статью в БЗX, именно данному вопросу и посвященную ;)
спустя 23 часа [обр] Rom McRitsky(0/441)[досье]
Господа, давайте не скатываться в оффтоп. Есть конкретный вопрос, хотелось бы получить конкретные ответы. Вопрос "надо/не надо" - не стоит.
спустя 5 часов [обр] Антон Клесс(0/25)[досье]
Корректно — если изменился хоть один символ в коде, изменилась и дата модификации.
Другой вопрос — всегда ли уместна такая корректность.
спустя 13 часов [обр] Алексей Пешков(0/19)[досье]

>Какова вероятность, что посетитель заходит повторно на страницу?

В реальном интернет-магазине за некоторый период времени (только HTML-страницы):
Код 200 - OK 405547
Код 304 - Not Modified 168349

спустя 2 месяца 7 дней [обр] Сергей Пантелеев(0/15)[досье]
Пытался внедрить 2 механизма для Last-modified - для случая с динамическим контентом и для SSI. В обоих случаях первые грабли, которые "сработали" - это добавление пункта меню. Если обращать внимание только на содержимое основного контента, то становится более чем реальной ситуация, когда юзер на разных страницах сайта видит, что пункт меню то появляется, то исчезает, а это уже реальный признак криворукости :) и повод для юзера покинуть сайт. Пришлось учесть такие "вспомогательные", но важные элементы и брать максимальную дату их изменений. Основной недостаток этого решения - нередко вычисление того, что контент изменился, требует столько же ресурсов, сколько и полное формирование страницы => экономим только на трафике+скорости отображения страницы у клиента.
В случае с SSI - включить отдачу заголовка можно директивой апача XBitHack, эта штука тоже выдает дату модификации только основного файла... Решение такое же как в первом случае, только нужно, чтобы генератор страниц SSI не перезаписывал файл, если он не изменился, и чтобы в тело файла включалась реальная дата его изменения (тогда файл сохранится-таки).
Powered by POEM™ Engine Copyright © 2002-2005