Wednesday, May 07, 2008

Кэширование изображений

Простой трюк, который может, вместе с тем, на ровном месте разгрузить веб-сервер и повысить тем самым производительность веб-приложения. Идея заключается в том, чтобы включить на клиентской стороне кэширование изображений, запрашиваемых с данного сайта. Вот, например, как это делается для J2EE серверов (источник - Coldbeans):

1. Добавляем к своему веб-приложению следующий фильтр: Expires filter. Этот фильтр позволяет добавлять на лету к обрабатываемым запросам HTTP заголовки Expires и Cache-control. Эти заголовки как раз и определяют кэширование результатов запроса на стороне клиента. Например, следующее описание в web.xml файле:

<filter>
<filter-name>ExpiresFilter</filter-name>
<filter-class>com.cj.expire.ExpiresFilter</filter-class>
<init-param>
 <param-name>expires</param-name>
 <param-value>86400</param-value>
</init-param>
</filter>

определяет кэширование на 1 сутки (время - в секундах)

2. Остальное прозрачно. Задаем мэппинг этого фильтра для изображений:

<filter-mapping>
 <filter-name>ExpiresFilter</filter-name>
 <url-pattern>*.gif</url-pattern>
</filter-mapping>

<filter-mapping>
 <filter-name>ExpiresFilter</filter-name>
 <url-pattern>*.jpg</url-pattern>
</filter-mapping>

...

теперь запрашиваемые изображения типа http://наш_сервер/что_то.gif будут кэшироваться на клиентской стороне

Для PHP можно, например, прописать установку данных заголовков прямо для Apache. Это что-то вроде следующего:

<FilesMatch "\.(jpg|jpeg|png|gif|ico)$">
 Header add "Expires" "Mon, 01 Jan 2018 00:00:00 GMT"
 Header add "Cache-Control" "max-age=31536000"
</FilesMatch>

1 comment:

Anonymous said...

При чём тут вообще PHP?