Назад | Перейти на главную страницу

как кэшировать мой сайт?

У меня есть несколько вопросов о кешировании веб-сайта, так как я раньше не пробовал кешировать сайт.

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

Из того, что я прочитал, кеширование в php выполняется через <head> тег, а также кеширование может быть выполнено в .htaccess (рад, что использую htaccess ^ _ ^).

Я добавил эти теги в свой заголовок

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta http-equiv="expires" content="-1">
<meta http-equiv="pragma" content="no-cache">//or content="cache"???

Также это то, что находится внутри моего htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

RewriteCond %{REQUEST_URI} ^application.*
RewriteRule ^(.*)$ /index.php?/$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]

</IfModule>

<IfModule !mod_rewrite.c>    
    ErrorDocument 404 /index.php
</IfModule>

Как заявил Дэвид, ваш вопрос очень широкий.

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

Что ж, у HTTP есть функции, которые позволяют вам это делать.

Начиная с основ, HTTP - это протокол запроса-ответа. Браузер отправляет запрос на ресурс, и сервер отвечает. И запросы, и ответы содержат заголовки, которые описывают, как браузер и сервер должны вести себя при получении ответов и запросов соответственно.

Вы можете указать браузерам ваших пользователей кэшировать изображения и .css, установив заголовки ответов в вашем файле .htaccess.

Заголовки, которые вам понадобятся в ваших ответах для достижения этой цели, описаны ниже:

HTTP / 1.1 предоставляет следующие заголовки ответов кеширования: Expires и Cache-Control: max-age. Они определяют «время жизни» ресурса, то есть период времени, в течение которого браузер может использовать кэшированный ресурс, не проверяя, доступна ли новая версия с веб-сервера. Это «сильные заголовки кэширования», которые применяются безоговорочно; то есть, как только они установлены и ресурс загружен, браузер не будет выдавать никаких запросов GET для ресурса до тех пор, пока не будет достигнут срок действия или максимальный возраст.

Last-Modified и ETag. Они определяют некоторые характеристики ресурса, которые браузер проверяет, чтобы определить, совпадают ли файлы. В заголовке Last-Modified это всегда дата. В заголовке ETag это может быть любое значение, однозначно идентифицирующее ресурс (обычно версии файлов или хэши содержимого). Last-Modified - это «слабый» заголовок кэширования, в котором браузер применяет эвристику, чтобы определить, извлекать ли элемент из кеша или нет. (Эвристика различается для разных браузеров.) Однако эти заголовки позволяют браузеру эффективно обновлять кэшированные ресурсы, выдавая условные запросы GET, когда пользователь явно перезагружает страницу. Условные GET не возвращают полный ответ, если ресурс не изменился на сервере, и поэтому имеют меньшую задержку, чем полные GET.

Важно указать одно из значений Expires или Cache-Control max-age и одно из Last-Modified или ETag для всех кэшируемых ресурсов. Избыточно указывать и Expires, и Cache-Control: max-age, или указывать и Last-Modified, и ETag.

Взято из: http://code.google.com/speed/page-speed/docs/caching.html.

После того, как вы поймете это и выберете заголовки, которые, по вашему мнению, лучше всего соответствуют вашим потребностям, вы можете сделать это с помощью apache mod_headers и директивы FilesMatch.

Вот пример того, что вы можете поместить в свой .htaccess (это может быть именно то, что вы хотите):

<FilesMatch "\.(css|swf|png|jpg|jpeg|gif)$">
Header unset Pragma
Header unset Expires
Header set Cache-Control "max-age=604800"
</FilesMatch>

Однако прежде чем вы это сделаете, я предлагаю вам загрузить плагин Google Page Speed ​​для Chrome (http://code.google.com/speed/page-speed/download.html) и установите его. Затем запустите тест скорости страницы и посмотрите его результаты, особенно раздел «Использование кеширования браузера», чтобы понять, действительно ли вам нужно предпринимать какие-либо действия.

Кэширование редко является «второстепенным» решением, но при правильной реализации оно может привести к значительному увеличению скорости работы веб-сайта.

Первый пункт, о котором вы упоминаете, «много изображений CSS» - это не проблема сервера как таковая. Чтобы получить их, браузер должен сделать запрос для каждого изображения, каждое со своими накладными расходами. Объедините изображения в спрайт CSS, чтобы можно было минимизировать количество запросов и максимизировать сжатие, применяемое выбранным форматом изображения. Похожая идея применима к файлам CSS и JS - объединяйте и минимизируйте, насколько это возможно. Чтобы получить рекомендации по конкретным сайтам, попробуйте Pagespeed от Google или YSlow от Yahoo.

На стороне сервера есть несколько кешей для PHP, в которых будут храниться промежуточные формы переведенного скрипта - кеши опкодов. Наиболее часто используется APC, но также часто используются xcache и eaccelerator (используйте только один из них).

Что касается PHP, кеширование обычно включает создание статической копии вашего контента. Этого можно добиться с помощью буферизации вывода (функции ob_ * (например, ob_start ()). Вы начинаете буферизацию перед отправкой любого содержимого, заканчиваете буферизацию после того, как ваша страница полностью построена, и сохраняете полученный контент в файл. Затем вы проверяете, наличие такого файла перед попыткой выполнения сценария PHP (т. е. если кеш существует, обслужить его, в противном случае загрузить сценарий).

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

Как и при любом подходе к кэшированию, вы сталкиваетесь с потенциальной проблемой утечки конфиденциальной информации - если вы кешируете страницу, которая должна быть видна только зарегистрированным пользователям, и в конечном итоге обслуживаете ее неаутентифицированному пользователю, у вас возникает проблема. Таким образом, такой сервер, как Varnish, имеет тенденцию не кэшировать запросы, содержащие файлы cookie - это важно учитывать, пытаясь действительно достичь высокой скорости попадания.

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

Ваш вопрос очень широкий. «Кэширование» выполняется на нескольких разных уровнях, поэтому вопрос «как мне кэшировать мой веб-сайт» немного похож на вопрос «как мне приготовить ужин». Есть много способов сделать это.

Вы можете кэшировать на уровне базы данных, если у вас есть динамический веб-сайт с базой данных, такой как MySQL. Вы можете кэшировать на уровне PHP с помощью кэш памяти или APC. Вы можете кэшировать на уровне сервера с помощью обратного прокси, например Лак.

И они даже не касаются кеширования на стороне клиента (то есть, каждый клиентский веб-браузер кеширует контент для этого конкретного человека), о чем вы говорите. .htaccess и информация заголовка.

Лучше сосредоточиться на кешировании на стороне сервера, а не на кешировании на стороне клиента.

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

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

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

В любом случае просмотрите эти темы, узнайте и не стесняйтесь возвращаться, когда у вас возникнут более конкретные вопросы.

Управление кешированием статических html-файлов с помощью метатегов не совсем стабильно, по крайней мере, на мой взгляд. Вы должны взглянуть на mod_expires (используя HTTP-заголовок для управления кешем): http://httpd.apache.org/docs/2.0/mod/mod_expires.html

Если вы хотите кэшировать динамические сайты, вы можете кэшировать всю страницу или только запросы к базе данных (в зависимости от вашей базы данных / дизайна сайта). Возможно, эта ссылка будет полезна: http://blog.digitalstruct.com/2008/02/27/php-performance-series-caching-techniques/