UpMark -  System of Professional Certification
UpMark - Система Сертификации Специалистов. Пройди тест - получи сертификат.   система
система тестирование
UpMark : Как установить дату документа (Кеширование и Last-Modifi : Сделать стартовойСделать закладку
 Как установить дату документа (Кеширование и Last-Modifi
В очередной раз копаясь на сайте php.net, я открыл для себя Америку в том, что исходники PHP-страниц доступны для открытого доступа. В индексной странице был обнаружен любопытный фрагмент: php.net не отправляет пользователю заголовков вроде Pragma: no-cache (это делает по умолчанию PHP), чтобы заставить браузер не кэшировать содержимое страницы и каждый раз обновлять его. Вместо этого используется заголовок HTTP/1.1 Last-Modified и связанный с ним ответ сервера "HTTP/1.1 304 Not Modified".

Выглядит это на php.net следующим образом:

// Получим дату изменения этого
PHP-файла
$timestamps<> = @getlastmod();

/*
   Дата prepend.inc представляет возраст ВСЕХ
   включённых файлов. Пожалуйста, обновите её при изменении
   любого другого включённого файла (если изменение
   влияет на отображание индексной страницы).
   Накладные расходы на stat слишком велики.
*/
$timestamps<> = @filemtime("include/prepend.inc");

// Календарь - единственная "динамическая" возможность на этой странице
$timestamps<> = @filemtime("include/pregen-events.inc");

// Самая поздняя из этих дат - наша настоящая дата Last-Modified
$timestamp = max($timestamps);

// Заметьте, что эта дата не соответствует RFC 822 (временная зона всегда
// равна GMT)
$tsstring = gmdate("D, d M Y H:i:s ", $timestamp) . "GMT";

// Проверяем, есть ли у клиента кэш этой страницы
if (isset($_SERVER<"HTTP_IF_MODIFIED_SINCE">) &&
    ($_SERVER<"HTTP_IF_MODIFIED_SINCE"> == $tsstring)) {
    header("HTTP/1.1 304 Not Modified");
    exit();
}
// Извещаем браузер о дате нашего последнего изменения
else {
    header("Last-Modified: " . $tsstring);
}

Я, как обычный человек, изучаю документацию, только когда очень нужно или очень интересно. Здесь мне стало интересно (к тому же про HTTP/1.1 читал мало).

Указано в RFC примерно следующее:
Для оптимизации кэширования контента браузером сервер может добавлять заголовок Last-Modified, который содержит дату последнего изменения документа в GMT-формате. День недели и слово GMT являются необязательными. Браузер, получив такую страницу, может поместить её в кэш; при повторном обращении он добавляет в запрос заголовок If-Modified-Since со значением, равным полученной дате Last-Modified.

Сервер, в свою очередь, если страница не изменилась, выдаёт браузеру ответ с кодом 304: HTTP/1.1 304 Not Modified. В случае же изменения возвращается обычный ответ HTTP/1.1 200 OK, а дальше — заголовки и тело страницы.

Плюсы этого приёма очевидны. Кэширование статических документов организуется просто и без участия программиста. С динамическими документами наподобие php-страниц дело обстоит сложнее, хотя именно на них часто приходится большая часть нагрузки сервера. На сайтах с медленным хостингом или объёмным трафиком может быть очень важно применение кэширования, которое достаточно просто реализуется. К тому же баннеры кэшироваться не будут, и всё обновление страницы сведётся к загрузке новых баннеров (что нам и нужно :)).

Хотя… Не всё так просто. Узнать дату последней модификации используемых файлов легко (см. функцию stat); кроме того, можно использовать приём php.net — когда при внесении изменений обновляется дата модификации какого-то конкретного файла.

Сложнее с базой данных. Но, как правило, известно, от каких таблиц зависит контент на данной странице. Получить дату изменения таблицы (по крайней мере, в MySQL) можно таким SQL-запросом:

show table status like `имя таблицы`;

В поле Update_time мы и получим искомое. Если написать просто

show table status;

то вернётся информация о всех таблицах.

Вот и всё.

Денис Малиновский

© Upmark.ru


Отзывы:
отзывов пока нет, ваш будет первым!

Оставьте свой отзыв:
Ваше имя:

Ваш отзыв о "Как установить дату документа (Кеширование и Last-Modified)":

контрольный код:




Смотрите также:
  • Справочник по Perl
  • Как перенести базу данных MySQL с одного сервера на другой?
  • Как установить дату документа (Кеширование и Last-Modified)
  • Телефонный код США. Правила пользования телефоном в USA
  • Игры с flash или о вреде flash заставки.

    Вы читали "Как установить дату документа (Кеширование и Last-Modified)"
  •   

    © 2004—2012 UpMark ltd
    регистрация  |  тесты  |  библиотека  |  каталог сайтов  |  контакты