Запрет кеширования посредством PHP

Материал из Викиреальностя
Перейти к: навигация, поиск

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

Запретить кэшировать документы браузером и Proxy-серверами можно при помощи средств языка PHP, а именно функции header().

  • По одним данным, для этого надо вставить в начало сценария следующий код:
header('Cache-Control: no-store, private, no-cache, must-revalidate'); // HTTP/1.1
header('Cache-Control: pre-check=0, post-check=0, max-age=0, max-stale = 0', false); // HTTP/1.1
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past  
header('Expires: 0', false); 
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header('Pragma: no-cache');
  • По другим, вполне достаточно строки:
Header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");

Для того, чтобы заставить веб-сервер передавать такие заголовки автоматически, требуется в файле .htaccess записать следующий код:

...
<IfModule mod_headers.c>
  Header set Cache-Control "no-store, no-cache"
</IfModule>

<IfModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "now"
</IfModule>
...

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

Запрет кеширования посредством PHP относится к теме «Программирование»   ±