WebWost WebWostbeta

Использование cache

Включение, использование, теория cache браузеров. Примеры с использованием Nginx, Apache, PHP.

Al-Sher

Иногда бывает необходимость как-то ускорить загрузку страницы и для этого есть различные методы: сокращаем количество файлов, выводящихся на страницу; сжимаем картинки; используем gzip; храним статические данные в cache у пользователя.

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

Давайте определимся, что же мы будем хранить в cache клиента и на какой период времени. Для примера воспользуемся тем, что уже изначально содержится в nginx: 

ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|css|swf|js|atom|jpe?g|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf

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

Давайте начнем конфигурацию нашего сервера.

Конфигурация Nginx

Nginx хранит свои файлы конфигурации по пути /etc/nginx/conf.d, поэтому мы туда и пойдем. Выбираем конфиг нашего домена(у меня это пусть будет ur0.conf):

nano /etc/nginx/conf.d/ur0.conf

Возможно, что у вас уже включено кеширование, поэтому давайте поищем в нашем файле слово expires. Если вы его нашли, то всё хорошо. Однако если его нет, то нам необходимо будет реализовать самим кеширование файлов. 

Вот код, подходящий к этой статье:

location ~* \.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|css|swf|js|atom|jpe?g|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
add_header Cache-Control private;
expires 10d;
}

Давайте разберемся, что же мы тут такое написали... И так, мы указываем серверу, что нам необходимы файлы, чьи имена кончаются на такие-то символы. Далее сервер добавляет им заголовок Cache-Control со значением private. Ну и на последок говорит браузеру, что хранить данный файл необходимо 10d, то есть 10 дней.

Возможно у вас возник вопрос: "Почему мы использовали Cache-Control private?". Ответ прост: Мы не хотим, чтобы наш сайт кешировался различными прокси, нам необходимо давать кеш определенному пользователю. Если вы хотите хранить кеш еще и на прокси, то воспользуйтесь Cache-Control public.

Вот такой небольшой код способен увеличить скорость загрузки за счет браузера клиента...

Конфигурация Apache

Apache так же способен хранить кеш у клиента, однако "из коробки" данные возможности ему не доступны.

Прежде чем приступать дальше убедитесь, что ваш Apache сервер имеет модули mod_headers и mod_expires.

Для работы с Apache мы будем строить конфигурацию файла в .htaccess нашего сайта. Давайте начнем с Cache-Control:

<ifModule mod_headers.c>
<FilesMatch "\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|css|swf|js|atom|jpe?g|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$">
Header set Cache-Control private
</FilesMatch>
</IfModule>

Разберем наш код. Для начала мы подключаем наш модуль mod_headers, ведь именно он будет встраивать нужные нам заголовки. Далее мы снова выбираем файлы, оканчивающиеся на наши "символы". Ну и добавляем им заголовок Cache-Control private. В общем-то чем-то похоже на конфигурацию Nginx.

Давайте теперь воспользуемся expires:

<ifModule mod_expires.c>
ExpiresActive On
ExpiresByType image/x-icon "access plus 10 days"
ExpiresByType image/jpeg "access plus 10 days"
ExpiresByType image/png "access plus 10 days"
ExpiresByType image/gif "access plus 10 days"
ExpiresByType application/x-shockwave-flash "access plus 10 days"
ExpiresByType text/css "access plus 10 days"
ExpiresByType text/javascript "access plus 10 days"
ExpiresByType application/javascript "access plus 10 days"
ExpiresByType application/x-javascript "access plus 10 days"
ExpiresByType text/html "access plus 10 days"
ExpiresByType application/xhtml+xml "access plus 10 days"
</ifModule>

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

Тут конфигурация отличается уже сильно: если в Nginx мы указывали расширения файлов, то тут уже указываем именно типы файлов.

Кеш и PHP

Иногда и php может выводить статические данные, поэтому и тут нужна возможность кеширования. Начнем с заголовка Cache-Control, это уже почти традиция :)

header("Cache-control: private");

Тут код вообще не требует описания, ведь в нем мы просто присваиваем Cache-Control private. Давайте теперь добавим время жизни, то есть Expires:

header("Expires: " . gmdate("D, d M Y H:i:s", time() + 60*60*24*10) . " GMT");

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

UPD: В заголовке Cache-Control можно так же указывать и время жизни, используя max-age, но лично мне привычнее это отдавать Expires`у.

Спасибо за ваше внимание, если у вас есть что дополнить, то пишите в комментариях. 

0 Комментариев

Новый комментарий