Шаг 5 - Написание скриптов с учетом кеширования

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

Максимальная продолжительность хранения страницы в кеше браузера пользователя нам скорее всего неподвластна, так как она зависит от настроек браузера, занятости диска и других параметров. Конечно можно сообщить браузеру о том, какое время страница точно не станет меняться, но сколько она при этом будет храниться в кеше не известно.

Зато практически со 100% уверенностью можно сказать браузеру и прокси о том, что страницу не стоит куда-либо сохранять. Для этого в протоколе HTTP есть несколько полей заголовка:

Подбирая значения этих полей можно управлять процессом кеширования страницы. Например, если дата последнего изменения страницы Last-Modified меньше, чем ее время жизни Expires, то браузер посчитает весьма закономерным поместить эту страницу в кеш. Если мы насильно поменяем значения этих полей, чтобы такое сравнение больше не проходило, то браузер перестанет кешировать эту страницу. Для вывода заголовков HTTP в PHP существует специальная функция header(), в описании которой в качестве примера приведен именно процесс контроля кешем:

<?php
// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

// HTTP/1.0
header("Pragma: no-cache");
?>

Если Вы будет вставлять этот код в начало каждого PHP файла, то он не будет кешироваться.

Этот код на Internet Explorer действует безотказно, зато почему-то не всегда на Opera и Firefox, возможно и на другие браузеры. Алгоритм их работы не всем известен, и возможно они игнорируют некоторые поля в заголовках ответов HTTP. Тогда в таком случае можно попробовать продублировать эти настройки в коде HTML, про это вы можете подробнее почитать в "Шаг 5 - Что умеет <head> ?".

Например можно создать такой код:

<?php
echo "<meta http-equiv=\"cache-control\" content=\"no-store, no-cache, must-revalidate\">";
echo "<meta http-equiv=\"expires\" content=\"Mon, 26 Jul 1997 05:00:00 GMT\">";
echo "<meta http-equiv=\"last-modified\" content=\"". gmdate("D, d M Y H:i:s") . " GMT\">";
?>

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


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Кузин Андрей.