Кэширование в php, пример

Author Автор: Роман Чернышов    Опубликовано: 17 мая 2011

Хочу немного рассказать начинающим программистам и вебмастерам о нужности, важности и несомненной полезности такого механизма как кэширование страниц в PHP. Большинство начинающих вебмастеров (или веб программистов), при написании какого либо скрипта сталкиваются с большой кучей сложностей. И для их решения тратят немало времени, в таких условиях не приходится думать об излишествах, к которым также относят и кэширование страниц. Думая при этом — «мол зачем, и так все сойдет, ведь скрипт работает, страницу отображаются», и думают так, почем зря.Кэширование страниц не обходимо как правило большинству скриптов, систем, сайтов как правило которые имеют сравнительно большую посещаемость. Т.к. при каждом посещении пользователем страницу, серверу приходится генерировать ее заново, выполнять зачастую огромный php сценарий и обрабатывать уйму mySQL запросов. Что несомненно приводит к излишним затратам ресурсов сервера (нагрузка CPU, использование памяти). В результате чего система начинает работать очень медленно, а в некоторых случаях и вообще подвисать выдавая ошибку.

Кэширование решает такие проблемы, и по возможности желательно встраивать эту возможность во все ваши проекты которые ориентированы на большую или даже среднюю (1000-3000 уников в сутки) посещаемость.

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

Что требует значительно меньше ресурсов сервера, не загружает память, и не грузит лишний раз SQL сервер.

Пример простого кэширования:

1. Создадим папку в корне вашего проекта и назавем ее /cache

2. Для безопасности, чтобы не кто посторонний кроме нашего скрипта не мог лазить в эту папку добавим в неё файл .htaccess, со следующим содержимым

Order Allow,Deny
Deny from all

3.  теперь переходим к самому кэшированию страницы, для этого в начале вставляем следующий PHP код

<?
 
$url=$GLOBALS['REQUEST_URI'];
$crc=md5($url);
 
$modif=time()-@filemtime ("cache/$crc");
 
if ($modif&lt;600)
{
include ("cache/$crc");
exit();
}
 
ob_start ();
 
?>

Этот код работает достаточно просто, сначалы мы генерируем MD5 хеш сумму, на основе полученного нами из переменной $GLOBALS['REQUEST_URI'] текущего адреса страницы. Полученный хеш мы будем использовать для обозначения имени файла, в котором будет хранится кэш данной страницы. Что очень удобно.

Затем в переменную <code>$modif мы сохраняем время последнего изменения файла, и после сверяем его с заданным значением. Если время хранения меньше 600 (10 мин), то значит что кэш еще свежий, и мы просто выводим его пользователю используя include ("cache/$crc"); В противном случае запускаем буферизацию командой ob_start ();

После чего в самом низу страницы вставляем код: <p>d88ef764be3a2078377c4bdce1fa4609005</p> Этот код при его разборе тоже достаточно прост. Получаем содержимое буфера командой <code>ob_get_contents(); и ложим его в переменную $cache, в буфере как понимаете у нас будет хранится вся страница целиком, в виде простого HTML кода. После чего очищаем буфер, дабы не забивать память сервера — ob_end_clean ();. И на конец выводим все содержимое из переменной $cache в браузер пользователя.

На последок остается только сохранить все содержимое переменной $cache в файл с названием состоящим из хеша урла текущей страницы. Что мы собственно и делаем.

Для удобства стоит также реализовать в данном примере возможность отключить кэширование тогда когда это нужно.

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

П.С, В следующих постах расскажу как использовать готовый (удобный и гибкий) класс zend_cache для кэширования страниц.

 

7 комментариев to “Кэширование в php, пример”

  • staiki 30.05.2011 в 11:44 дп

    Всё тот же вопрос..-нет ли подобного скрипта для вставки в шаблон php а не в корень сайта?Если есть-будьте добры-выложите сам скрипт.Думаю многие будут благодарны в том числе и я!

    • Роман Чернышов 30.05.2011 в 2:05 пп

      Собственно представленный скрипт, можно вставить в любое места вашего скрипта. Нет необходимости вставлять его в корень.

  • staiki 30.05.2011 в 2:17 пп

    Не понял…Тоесть эти коды вставить в html-шаблон и всё?А разве не нужно что-то типа
    код

  • staiki 30.05.2011 в 2:20 пп

    не пробивает начало и конец закрытия скрипта..script type=»text/javascript» код /script -типо этого..

  • Роман Чернышов 30.05.2011 в 3:19 пп

    это код примера на PHP, его нужно вставлять в скрипт (с расширением .PHP)

  • staiki 30.05.2011 в 3:47 пп

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

  • имя 08.08.2012 в 8:29 пп

    шикарно и просто никогда не задумывался об это и не встречал.
    Хочу добавить, по сути любая страница набор статических и динамических блоков, дак вот применять этот механизм непосредственно к статичным блокам дающим нагрузку на сервер (><)

Оставить комментарий на Роман Чернышов

Автор блога
Роман Чернышов
Веб-разработчик,
Full Stack
Senior, Architect
PHP, JavaScript, Node.JS, Python, HTML 5, CSS 3, MySQL, Bash, Linux Admin
Заказать работу
предложить оффер

Моя книга
Книга. Веб-разработчик. Легкий вход в профессию
Печатная книга
Веб-разработчик.
Легкий вход в профессию
Оформить предзаказ
Последние вопросы
Список вопросов
Последние комментарии
Меню

Archive

Мои проекты
Insurance CMS Love Crm CMS Совместные покупки Мой PHP Framework Хостинг для моих клиентов Лицензии на мой софт и поддержка