php 7 кэширование страниц
PHP и Web. Кэширование
Вступление.
Для оптимизации работы с сетью используется механизм сохранения однажды полученных по HTTP документов в кеше с целью их повторного использования без обращения к серверу-источнику. Документ, сохраненный в кеше будет доступен при следующем обращении к нему, без выгрузки с сервера-источника, что призвано повысить скорость доступа клиента к нему и уменьшить расход трафика сети.
Сами кэши бываю двух видов — локальные и общие. Локальный это кеш, хранимый непосредственно на диске у клиента, создаваемый и управляемый его браузером. Общий — кэш прокси-сервера организации или провайдера и может состоять из одного или нескольких прокси-серверов. Локальный кеш присутствует, наверное в каждом браузере, общими пользуется значительная часть людей использующих Internet. И если малую часть сайтов сейчас оценивают по расходу трафика, то скорость загрузки — важный критерий, который должен учитываться при разработке Вашего web-проекта.
Для динамических страниц, создаваемых в результате работы PHP-программы, казалось бы, кэширование вредно. Содержание страницы формируются по запросу пользователя на основе какого-либо источника данных. Однако, кэширование может быть полезным. Управляя им Вы можете сделать работу с Вашим сервером комфортнее для пользователя, разрешая загрузку из кэша определенных страниц, предотвращая тем самым их повторную выгрузку с Вашего сервера и экономя пользователю время и трафик.
Кэшировать или нет?
Возможность сохранения в кэш страницы определяется динамичностью информации в источнике данных. Таким образом необходимость использования кэша определяется Вами, исходя из планируемого времени жизни страницы.
Если речь идет о формировании выборки по базе (например, поиск введенного пользователем слова), то такую страница обязательно следует запрашивать с сервера при каждом вызове без использования кэш, так как количество вариантов запрашиваемых слов огромно, а если мы к тому же имеем дело с меняющимся массивом данных, то кэширование бессмысленно. Или речь идет о формировании допустим графика приходящих посетителей (который изменяется с каждым визитом, то есть практически с каждым вызовом), то кеширование уже просто вредно.
Однако, если мы говорим о том же графике но за вчерашний день, то кэширование рекомендуется, так как данные изменяться уже не будут и мы можем экономить себе и пользователю ресурсы и время на загрузку таких страниц помещением их в локальный или общий кэш. Как продолжение этой ситуации формирование графика не в реальном масштабе времени, а ежечасно. Тут Вы можете заранее предсказать дату окончания «срока годности» сформированных данных.
Общие принципы сохранения страниц в кэш.
PHP-программа может управлять кэшированием результатов ее работы формируя дополнительные поля в заголовке HTTP ответа вызовом функции Header().
Несколько общих утверждений характерных не только для PHP-программ:
Таким образом в большинстве ситуаций дополнительных инструкций в программу добавлять не надо. Основные моменты на которые следует обратить внимание можно свести к двум:
Запрет кэширования документов, кэшируемых по умолчанию
Эта задача возникает для PHP-скриптов вызываемых без параметров или являющимися индексами директорий, однако формирующих данные персонально под пользователя (например на основе cookies или user agent) или работающих на основе быстро изменяющихся данных. По спецификации HTTP/1.1 мы можем управлять следующими полями:
Кэширование данных страниц в php
Кэш — это специальный промежуточный буфер с очень быстрым доступом, содержащий данные, которые могут быть запрошены с наибольшей вероятностью.
Что такое кэширование?
Для оптимизации работы с сетью применяется механизм сохранения полученных однажды по HTTP документов в кеше для их повторного использовании, при этом без обращения к серверу-источнику. Документ, который сохранен в кеше будет доступен при последующем обращении к нему, при этом без выгрузки с сервера-источника. Это призвано увеличить скорость доступа клиента к нему, а также снизить расход трафика сети.
Для динамических страничек, которые создаются в результате работы PHP-приложения, казалось бы, кэширование весьма вредно. Содержание странички формируются по запросу пользователя на основе определенного источника информации. Тем не менее, кэширование бывает полезным. Управляя им можно сделать работу с вашим сервером гораздо удобнее для пользователя, разрешая загрузку из кэш конкретных страниц, предотвращая таким образом их повторную выгрузку с сервера и экономя пользователю трафик и время.
Ключевые принципы сохранения страниц в кэш
PHP-приложение может управлять кэшированием результатов его работы формируя дополнительные поля в заголовке HTTP ответа вызовом специальной функции Header().
Несколько общих утверждений, которые характерны не только для PHP-приложений:
В большинстве ситуаций каких-то дополнительных инструкций в приложение добавлять не нужно. Основные нюансы, на которые надо обратить внимание:
Запрет на кэширования документов (которые кэшируются по умолчанию)
Эта задача возникает для PHP-скриптов, которые вызываются без параметров или являются индексами директорий, но формируют информацию персонально под пользователя (к примеру на основе user agent или же cookies) или работают на основе быстро изменяющихся сведений. Мы по спецификации HTTP/1.1 можем управлять такими полями:
Чтобы запретить кэширование, достаточно прописать:
Для того, чтобы документ пометить как «устаревший», необходимо установить Expires равным полю Date.
Не следует также забывать о том, что формы, которые запрошены по POST кэшированию не подлежат.
Кэширование с прогнозируемым обновлением
Главной задачей здесь является получить дату следующего понедельника в виде RFC-1123.
Данным способом можно очень эффективно управлять поведением странички в кэш. Можно выделить особые временные интервалы в течении которых содержание определенной странички остается постоянным.
Другой подход, который применяется при более оперативном обновлении данных и одновременной большой посещаемости сервера (в другом случае кэширование эффективным не будет) состоит в использовании специального заголовка Cache-control: max-age=секунды, который определяет время, по истечении которого документ уже считается устаревшим и имеющий гораздо больший приоритет при вычислении свежести конкретного документа.
Если Вы публикуете новости с интервалом в 60 минут:
Реализация кэширования на PHP
Начнем с первого файла, который назовем read_cache.php.
В этом скрипте мы получаем имя файла, потом проверяем есть ли такой кэш, потом выводим его и заканчиваем работу или открываем буфер, в который будем помещать все выходные данные скрипта.
Теперь создадим специальный файл write_cache.php. Он будет записывать в файл то, что накопилось в буфере.
Теперь в любом php-файле, который отвечает за вывод, можно включить кэширование:
Теперь вы можете все проблемные странички начать кэшировать. Однако не забывайте, пока кэш живет, пользователь не будет видеть любые обновления. В связи с этим, делайте кэширование на PHP лишь для тех страниц, которые очень редко обновляются.
PHP Performance Series: Caching Techniques
Кеширование промежуточного кода (Opcode Caching)
Кэширование кода это один из самых легких и эффективных путей увеличения производительности в PHP. Использовании данного вида кэширования позволит избавиться от большого количества неэффективностей, возникающих при процессе запуска выполнения кода. Кэширование кода сохраняет промежуточный код в памяти для того чтобы не компилировать PHP-код каждый раз при запуске файла.
Существует множество библиотек для такого кэширования, например, APC, XCache, eAccelerator и Zend Platform.
Кэширование промежуточного кода файлов
Когда у нас есть большое количество кода и наш сервис отличается большой посещаемостью, скорее всего мы не будем ждать, когда каждый PHP-файл будет обработан при его вызове, логично в этом случае запустить некий скрипт перед выкладкой кода на сервера, который сразу создаст промежуточный код. Например, код такого скрипта может быть реализован так
Кэширование переменных
Большинство библиотек кэширования позволяет кэшировать значения переменных. Очень полезно сохранять значения конфигурации или данные, которые сложно вычислить (получить) и которые не меняются (возможно не меняются в течение некоторого времени, тогда на базе такого кэширования можно реализовать кэширование с устареванием, примечание переводчика).
Concurrency Level: 5
Time taken for tests: 30.33144 seconds
Complete requests: 684
Failed requests: 0
Write errors: 0
Concurrency Level: 5
Time taken for tests: 30.12173 seconds
Complete requests: 709
Failed requests: 0
Write errors: 0
Как вы видите, мы получили около 3-4% в производительности, закэшировав значения конфигурационного файла. Существует много других мест, которые также можно оптимизировать, нахождение таких мест позволит увеличит количество обработанных запросов.
Файловое кэширование результатов
В некоторых случаях сервер обрабатывает запросы, результатом которых является одинаковый контент. Есть возможность закэшировать подобные вид контента (полностью или его часть)
В данном тексте иллюстрируется пример на основе пакета Pear::Cache_Lite.
Полное кэширование вывода
Полное кэширование довольно тяжело выполнить на большинстве сайтов с постоянно обновляющимися данными из большого количества источников. Все это правда, однако, нет необходимости обновлять данные каждую секунду. Даже 5-10 минутная задержка при экстремально высокой загрузке сайта позволит вам увеличить производительность.
Пример ниже, сохраняет слепок страницы для будущего использования. Такой подход может помочь большому количеству пользователей.
Я не рекомендую использовать данное решение, но если вам нужно что-то быстрое, вы можете его использовать, рано или поздно вы увидите недостатки этого метода.
The Bootstrap Cache Example:
require(‘/path/to/pear/Cache/Lite/Output.php’);
$options = array(
‘cacheDir’ => ‘/tmp/’,
‘lifeTime’ => 10
);
$cache = new Cache_Lite_Output($options);
if (!($cache->start($_SERVER[‘REQUEST_URI’])))
<
require(‘/path/to/bootstrap.php’);
$cache->end();
>
.htaccess
php_value auto_prepend_file /path/to/cache_start.php
php_value auto_append_file /path/to/cache_end.php
cache_start.php
require(‘Cache/Lite/Output.php’);
$options = array(
‘cacheDir’ => ‘/tmp/’,
‘lifeTime’ => 10
);
$cache = new Cache_Lite_Output($options);
if (($cache->start($_SERVER[‘REQUEST_URI’])))
exit;
Частичное кэширование
Частичное кэширование это типичный путь оптимизации. Скорее всего на вашем сайте есть части, которые очень редко изменяются или не должны изменяться в реальном времени. Это именно тот случай, когда необходимо применять частичное кэширование и оно позволит вам увидеть приращение в производительности.
Кэширование значения строк
Как вы видите, вы можете сохранять в кэше различные типы данных. Однако, использовать файловое кэширования я бы не рекомендовал для сохранения результатов запросов к базе данных.
Кэширование в оперативной памяти
Существует множетсво путей для того чтобы произвести кэширование в памяти: memcached, memory tables в базах данных, RAM disk и другие.
Memcached
С сайта memcache memcached это высокопроизводительная и распределенная кэширующая система, которая увеличивает скорость динамических веб-приложений путём снижения загрузки с базы данных.
О чем это говорит, о том, что можно сохранить данные на одном сервере, к которому будут обращаться другие сервера, это не зависит от вашего веб-сервера (как в случае кеширования промежуточного кода), так как memcached – это демон, который в большинстве случаев используется для кэширования результатов запросов к базам данных.
Пример работы с Memcache:
session.save_handler = memcache
session.save_path = «tcp://hostname:11211»
Я бы попытался избегать такого подхода, так как считаю, что риск в этом случае перевешивает выгоду, когда речь идет о большом количестве серверов. В таком случае лучшем выходом является использование memcached.
Надеюсь, что описанное выше было достаточно информативно. Здесь не описан весь потенциал кэширования, например использование кэширования в распределенных базах данных или использование Squid. В будущих статьях я опишу и это…
Что такое кэширование
Применительно к сфере хостинга и сайтостроения можно описать несколько ситуаций, в которых используется кэширование:
HTTP-кэширование страниц и изображений в браузере
Все данные, которые загружает пользователь через браузер, можно разделить на два типа:
Принцип действия кэширования
1. Когда сайт загружается в браузер, тратится время на получение с сервера всех компонентов, из которых состоит страница.
2. Не изменяющиеся статические данные загружаются лишь один раз, а затем хранятся в файловом кэше браузера на компьютере пользователя.
3. При повторном заходе на страницу браузер уже не закачивает эти данные с сервера, а отображает их прямо из своего кэша, экономя время на загрузку и пропускную способность канала связи с интернетом.
Эта технология называется кэширование интернет-ресурсов в браузере или HTTP-кэширование.
Чтобы управлять HTTP-кэшированием, браузер использует специальные HTTP-заголовки Expires и Cache-control, которые отправляет web-сервер при отдаче страниц.
Примеры заголовков
Просмотреть HTTP-заголовки ответа сервера можно при помощи специальных онлайн-сервисов.
1. Например, в SEO-auditor нужно в специальном поле указать URL проверяемой страницы. Во втором поле выбрать в выпадающем списке браузер, которым вы пользуетесь в данный момент.
2. После этого нажмите на кнопку “Проверить”и дождитесь результата.
Cache-Control: max-age=3600
Заголовок означает, что страница с момента скачивания браузером гарантированно не будет меняться в течение 3600 секунд, то есть одного часа. На протяжении этого времени при повторном запросе браузеру предписано брать ее из кэша.
Также браузер может взаимодействовать с web-сервером, посылая запрос о том, была ли изменена конкретная страница за определенное время. В этом случае web-сервер отправляет вместе со страницей заголовок Last-Modified с указанием времени последнего изменения страницы, например:
Last-Modified: Sun, 1 Aug 2020 01:00:00 GMT.
Если web-сервер знает, что с момента времени, указанного в запросе, страница не менялась, то он отвечает специальным кодом HTTP 304 (Not Modified), увидев который, браузер заберет страницу из кэша. В противном случае происходит загрузка новой версии страницы с сервера (и заодно получение нового заголовка Last-Modified).
К недостаткам этой схемы HTTP-кэширования можно отнести необходимость постоянных запросов от браузера к серверу.
Вместо HTTP-заголовков Last-Modified и If-Modified-Since, можно использовать другую комбинацию заголовков: ETag и If-None-Match, принцип действия которых аналогичен.
Сценарий работы HTTP-кэширования должен выглядеть так.
Нужно, чтобы ответ сервера для запроса браузером страницы содержал сразу два заголовка: Last-Modified и Cache-Control/Expires. Браузер будет выбирать оптимальную стратегию для кэширования, исходя из содержащейся в них информации.
Настройка кэширования в браузере со стороны web-сервера
Рассмотрим, как можно настроить кэширование страниц в браузере для популярного web-сервера Apache.
Включить отдачу информации для кэширования
ExpiresActive On
#кэшировать изображения один месяц
ExpiresByType image/x-icon «access plus 30 days»
ExpiresByType image/jpeg «access plus 30 days»
ExpiresByType image/png «access plus 30 days»
ExpiresByType image/gif «access plus 30 days»
#кэшировать файлы-иконки один год
ExpiresByType image/ico «access plus 365 days»
#кэшировать css, javascript файлы одну неделю
ExpiresByType text/css «access plus 7 days»
ExpiresByType text/javascript «access plus 7 days»
ExpiresByType application/javascript «access plus 7 days»
ExpiresByType application/x-javascript «access plus 7 days»
Схема настройки кэширования скриптов
Для управления кэшированием в браузере используют заголовок Cache-Control. Например, добавление заголовка в указанный файл Cache-Control: private, max-age=60 будет кэшировать результат запроса в браузере на 60 секунд.
Кэширование страниц сайта на сервере
Простая схема отдачи для пользователя динамических страниц выглядит так:
1. Web-сервер запрашивает информацию из базы данных (или других источников).
2. Затем из этих данных создает HTML-код страницы.
На все это тратятся время и ресурсы сервера. Принцип серверного кэширования подразумевает, что сгенерированный HTML-код сохраняется в файл на диске, и при условии, что данные для создания страницы не изменялись, этот файл будет отдаваться пользователю напрямую при следующем запросе страницы.
Выгода от такого подхода понятна: экономия времени и аппаратных ресурсов сервера.
В случае сложных и больших по объему информации запросов к базе данных, разница по времени отдачи страницы может достигать десятков и сотен раз.
Схема работы серверного кэширования для самописного сайта на PHP
Ускорение WordPress с помощью кэширования
Практически для всех популярных CMS существуют модули серверного кэширования страниц. Рассмотрим на примере CMS WordPress, как настраивается такой модуль и режим кэширования.
Дополнительные модули для WordPress распространяются в виде плагинов. Разработано много различных плагинов WordPress, обеспечивающих серверное кэширование, например:
1. Чтобы его установить, зайдите в панель администрирования WordPress и найдите раздел “Плагины”.
2. Нажмите на кнопку “Установить”.
3. После установки LiteSpeed Cache он появится в списке плагинов, и нужно будет его активировать в WordPress.
4. После активации LiteSpeed Cache сразу готов к работе и производит кэширование страниц сайта со стороны сервера.
5. Для тонкой настройки опций кэширования вам станет доступен специальный раздел в административной панели WordPress.
Этот плагин также поддерживает кэширование страниц сайта в оперативной памяти сервера, что дает еще большую скорость, по сравнению с использованием кэширования на диске.
Для этого на сервере должно быть установлено программное обеспечение Redis или Memcached.
Их установка подходит для пользователей услуги VPS/VDS и выделенных серверов.
Авторы плагина даже разработали свой собственный web-сервер LiteSpeed, в комбинации с которым этот плагин работает наиболее эффективно.
Для серверного кэширования сайтов на WordPress использование LiteSpeed Cache как автоматически настроенной услуги предлагают многие провайдеры виртуального хостинга в рамках особых тарифных планов “Хостинг WordPress”.
Кэширование PHP-скриптов
Эта техника кэширования непосредственно касается сайтов, созданных на языке программирования PHP, и используется на VPS/VDS и выделенных серверах.
Механизм кэширования этих кодов работает по принципу: если код конкретной страницы не изменялся, то можно использовать уже готовые опкоды для этой страницы и не проводить заново процесс разбора кода и его преобразования.
Для этого используется специальное расширение PHP OPCache, которое занимается оптимизацией и кэшированием опкодов.
Вы как администратор сервера можете самостоятельно настроить свою систему и подключить на сервере расширение OPCache для движка PHP.
Данный метод экономит вычислительные ресурсы сервера и хорошо помогает ускорить работу нагруженных сайтов с высокой посещаемостью.
Кэширование запросов к базе данных
Современные системы управления базами данных, такие как MySQL, поддерживают кэширование запросов прямо “из коробки”.
В случае использования виртуального хостинга эта функция уже настроена провайдером оптимальным образом.
Пользователи VPS/VDS и выделенных серверов могут управлять количеством оперативной памяти, выделяемой под кэширование запросов к базе данных. Для нагруженных сайтов с большим объемом данных в базе и высокой посещаемостью оптимальный размер кэша запросов может достигать нескольких сотен мегабайт.
Кэширование в PHP
Введение
Появление динамических web-страниц изменило положение вещей в худшую сторону, эффективно «сломав» эту модель обслуживания web-страниц благодаря наличию двух проблем:
Как я предотвращаю кэширование страницы браузерами?
Прежде чем мы рассмотрим методы клиентского и серверного кэширования, в первую очередь мы должны понять, как вообще предотвратить кэширование страниц web-браузером (и прокси-серверами). Основной способ достижения этого использует мета-тэги HTML:
Вставив прошедшую дату в мета-тэг Expires, вы сообщаете браузеру, что кэшированная копия странички всегда является устаревшей. Это значит, что браузер никогда не должен кэшировать страницу. Мета-тэг Pragma: no-cache довольно хорошо поддерживаемое соглашение, которому следует большинство web-браузеров. Обнаружив этот тэг, они обычно не кэшируют страницу (хотя никаких гарантий нет, это всего лишь соглашение).
Это хорошо звучит, но есть две проблемы, связанные с использованием мета-тэгов:
Лучший подход состоит в том, чтобы использовать непосредственно протокол HTTP с помощью функции PHP header(), эквивалентно приведённым выше двум мета-тэгам:
Мы можем пойти на один шаг вперёд, воспользовавшись заголовком Cache-Control совместимым с браузерами, поддерживающими HTTP 1.1:
Это гарантирует, что никакой web-браузер или промежуточный прокси-сервер не будет кэшировать страницу, таким образом посетители всегда получат самую последнюю версию контента. Фактически, первый заголовок должен быть самодостаточным, это лучший способ гарантировать, что страница не кэшируется. Заголовки Cache-Control и Pragma добавлены с целью «подстраховаться». Хотя они не работают во всех браузерах или прокси, они отловят некоторые случаи, в которых Expires не работает должным образом (например, если дата на компьютере клиента установлена неправильно).
Конечно, полный отказ от кэширования обеспечивает нас проблемами, которые мы обсуждали в начале этой главы. Сейчас мы рассмотрим решение этих проблем.
Internet Explorer и кэширование загрузки файлов
Как я могу захватить данные на стороне сервера для кэширования?
Несколько слов о кэшировании при помощи шаблонов
Пример 1. Файл: 1.php
Вышеописанный скрипт выведет:
Заголовки HTTP и буферизация вывода
(прим. переводчика: следует заметить что подобное использование данной функции крайне неоправдано. В большинстве случаев необходимости в использовании буферизации вывода для избавления ошибок указанного типа просто не существует и всё с лёгкостью может быть исправлено правильным проектированием приложения)
Использование буферизации вывода для кэширования на стороне сервера
Вы уже видели базовый пример буферизации вывода, теперь следующий шаг, в котором буфер сохраняется в файл:
Пример 2. Файл: 2.php
Сначала вышеописанный скрипт проверяет наличие существования версии странички в кэше, и, если она имеется, скрипт читает и выводит её. В противном случае, он использует буферизацию вывода для создания версии страницы в кэше. Она сохраняется как файл, после использования ob_end_flush() для отображения страницы пользователю.
Блочная буферизация
Вне всякого сомнения, некоторые части отправляемой вами посетителю страницы изменяются очень редко, например, такие как шапку, меню и нижний колонтитул. Однако другие части, типа таблиц, содержащих обсуждения в форуме, могут изменяться довольно часто. Буферизация вывода может использоваться к кэшированию разделов страницы в отдельных файлах, затем создавать из них страницу – решение, устраняющее необходимость повторных запросов к базе данных, циклов while и т.д. Вы можете назначать каждому блоку страницы дату истечения срока, после которой пересоздаётся кэш-файл, или кроме того, вы можете включить в ваше приложение механизм, который будет удалять кэш-файл каждый раз, когда сохранённый в нём контент изменён.
Вот пример, демонстрирующий этот принцип:
Пример 3. Файл: 3.php
В этом примере я использовал процедурный подход. Однако я не советую делать это на практике, поскольку это закончится очень грязным кодом (смотри последующие решения с лучшей альтернативой) и, вероятно, вызовет проблемы с блокировкой файла (например, что случится, когда кто-то обращается к кэшу в момент его обновления?).
Пример 4. Файл: 3.php
Для содержимого (тела) страницы мы по прежнему будем использовать тот же процесс. Однако на сей раз при вызове readCache мы будем использовать время жизни кэша в пять секунд, кэш-файл будет модифицироваться каждый раз, когда он «старше» 5 секунд:
Пример 5. Файл: 3.php
Нижний колонтитул эффективно изменять так же, как заголовок. После этого буферизация вывода останавливается и отображается содержимое трёх переменных, содержащих данные страницы:
Пример 6. Файл: 3.php (окончание)
Конечный результат выглядит примерно так:
Заголовок и нижний колонтитул обновляются еженедельно, в время как тело модифицируется, когда оно старее 5 секунд.
Блок-схема на рисунке суммирует методологию блочной буферизации.
Блок-схема блочной буферизации вывода
Вложенные буферы
Как мне управлять кэшированием на стороне клиента средствами PHP?
Новые имена функций
Проверка HTTP-заголовков в вашем браузере
Истечение срока жизни страницы
Пример 7. 6.php
Функция setExpires отправляет заголовок HTTP Expires с будущим временем, заданном в секундах. Вышеприведённый пример показывает текущее время по Гринвичу и выводит ссылку, которая вам позволяет перейти на страницу вновь. Используя кнопку Refresh вашего браузера, вы можете сообщить браузеру о желании обновить кэш. Используя ссылку, вы увидите, что время изменяется только раз в 10 секунд.
Даты и время в HTTP
Даты в HTTP всегда вычисляются относительного меридиана времени Гринвича (GMT). Функция PHP gmdate() точно такая же функция, как date(), за исключением того, что она автоматически компенсирует время по Гринвичу, основанное на системных часах и настройках региона вашего сервера.
Заголовок Expires преимущественно прост в реализации, но в большинстве случаев, если вы не высокоорганизованный человек, вы не можете знать точно, когда данная страница вашего сайта обновлена. Поскольку браузер войдёт в контакт с сервером только после того, как страница устареет, нет ни одного способа сообщить браузеру, что страница, находящаяся в его кэше, устарела. Вы также теряете некоторую часть трафика к вашему web-сайту, поскольку браузер не обращается к серверу при запросе страницы из кэша.
Время изменения страницы
Устанавливаем время модификации кэш-файла этой строкой:
Наконец, мы проверяем, был ли модифицирован кэш с тех пор как посетитель получал эту страницу в последний раз. Если это не так, мы просто посылаем в заголовке отклик Not Modified и прекращаем выполнение скрипта, не нагружая канал передачи данных и экономя процессорное время, инструктируя браузер отобразить кэшированную версию страницы.
И в заключение готовый кусок кода, позволяющий кешировать все статические ваши страницы.
Если вы объедините подход времени последнего изменения со значением времени, являющимся уже доступным в вашем приложении (например, время самой последней новостной статьи, или время устаревания из системы серверного кэширования, которое мы видели в последнем решении), вы сможете воспользоваться преимуществами кэша web-браузера и разгрузите канал передачи данных, по возможности сэкономив информационный трафик с вашего сайта и улучшив его производительность.
Будьте осторожны при тестировании любого кэширования, выполненного в таком стиле, если вы сделаете это неправильно, вы можете заставить ваших посетителей всегда иметь устаревшие копии вашего сайта.
Кэширование ваших страниц в 5 шагов
Расмотрим технологию кэширования пошагам:
Все ваши страницы будут кэшироваться на 3600 секунд = 1 час. Этот параметр вы легко можете поменять в скрипте start_cache.php. Кэш страниц будет сохранен в папке cache_files.
Совершенно очевидно, что в данном случае атрибуты 777 являются определенным нарушением безопасности. В связи с чем, рекомендую вынести папку cahce_files за пределы public_html, например, поместить ее на один уровень выше. Это закроет доступ к находящимся в ней файлам пользователей вашего сайта, но никак не повлияет на работоспособность системы.
Также, у данного метода есть еще один серьезный недостаток: автор статьи складывает весь кэш в одну папку, что, при достаточном количестве страниц на вашем сайте, вызовет проблему, например, в системах Unix наблюдается достаточное замедление работоспособности при наличие в папке более чем 1000 файлов. В связи с чем, в алгоритм необходимо внести ряд изменений и раскладывать файлы по отдельным подпапкам внутри папки cache_files. Например, используя для этого первые 3-4 символа md5 КЭШа.
Для динамических ресурсов вполне возможно выбрать время кэширования в несколько (5-10) секунд или 1-2 минуты, что уже значительно снизит нагрузку на сервер, но не нанесет вреда интерактивности сайта.
Для страниц, для которых особо важна интерактивность, можно ввести исключения в .htaccess, что позволит именно им постоянно изменяться, а для остальных страниц можно применять кэширование.
Регенерация содержания на лету
Динамически созданные, но статически обслуживаемые страницы, т.е. страницы которые должны передаваться как чисто статические (считываемые из файловой системы и затем передаваемые по запросу), однако они должны быть динамически сгенерированны веб-сервером если они отсутствуют в файловой системе. Таким образом вы можете иметь страницы сгенерированные PHP которые являются статически обслуживаемыми если только кто-либо (либо планировщик) не удалит статическое содержание. В таком случае содержание обновляется.
Это делается следующим набором директив:
Здесь, запрос к page.html приводит к внутреннему запуску соответствующего page.php, если page.html все-ещё отсутствует или имеет нулевой размер. Фокус здесь в том что page.php это обычный PHP скрипт который в дополнение к собственному выводу, записывает свой вывод в файл page.html. Запустив это один раз, сервер передает данные page.html. Когда вебмастер хочет обновить содержание, он просто удаляет page.html (обычно с помощью cronjob).