воскресенье, 29 декабря 2013 г.

Запретить или разрешить кэширование в PHP или Apache


Столкнулся с кэшированием и узнал, что запрет кэширования методом в Wikipedia не работает. Вот этот метод:
<?php
/*
 ** Проверка работоспособности кода запрета кэширования
*/
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate( "D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
echo "<h1>", date("H:i:s"), "</h1>";
?>
 
А теперь о том, что протестировано и то, что работает.
Запретить кэширование на PHP:
<?php
/*
 ** Правильный запрет кэширования на PHP
 */
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Expires: " . date("r"));
echo "<h1>", date("H:i:s"), "</h1>";
?>
Чтобы не приписывать каждой странице эти сточки на PHP, можно сделать это на уровне конфигурации Apache, для этого нужно:
1) Зайти в конфиг Апача и убедиться, что следующие модули включены. Если они закомментированы, то раскомментируйте их:
LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
...
AddModule mod_expires.c
AddModule mod_headers.c
2) В файле .htaccess вписать строки, запрещающие кэширование:
# Запрещение кеширования
# Необходимо включение модулей
# mod_headers.c и mod_expires.c
 
# Заголовок Cache-Control
<IfModule mod_headers.c>
 Header append Cache-Control "no-store, no-cache, must-revalidate"
</IfModule>
 
# Заголовок Expires
<IfModule mod_expires.c>
 ExpiresActive On ExpiresDefault "now"
</IfModule>
Но полный запрет кэширования повышает нагрузку на сервер и замедляет загрузку контента на стороне пользователя. Поэтому, предложенный ниже способ разрешает кэширование только на один час. Т.е. обновляться кэш на стороне пользователя будет раз в час, при этом Вы сэкономите ресурсы своего сервера.
Разрешаем кэширование на 1 час при помощи PHP:
<?php
/*
 ** Включение кэширования на 1 час
 */
header("Cache-Control: public");
header("Expires: " . date("r", time() + 3600));
echo "<h1>", date("H:i:s"), "</h1>";
?>
Или разрашем кэширование на 1 час при помощи конфига Апача.
1) Убеждаемся, что нужные модули mod_headers.c и mod_expires.c включены (как было описано выше).
2) В нужной папке создаем файл .htaccess и прописываем следующие строки:
# Разрешение кеширования
# Необходимо включение модулей
# mod_headers.c и mod_expires.c
 
# Заголовок Cache-Control
<IfModule mod_headers.c>
 Header append Cache-Control "public"
</IfModule>
 
# Заголовок Expires
<IfModule mod_expires.c>
 ExpiresActive On ExpiresDefault "access plus 1 hours"
</IfModule>

IT-записки

comments powered by Disqus