Кэширование в PHP

Кэширование в PHP

Давно интересовался классом кэширования данных в php которые выводятся скриптом. Так зачем же вообще использовать кэширование и что нужно кэшировать?

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

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

А если немного попотеть, то можно прикрутить этот скрипт кэширования к своему блогу на WordPress.

Хотя проще использовать тот-же WP Super Cache.

Нередко скрипт ускоряет загрузку в ого-го раз 🙂

И так, привожу сразу листинг самого класса:

<?

class cache {

 var $cache_cont;                // Кэшируемый контент

 var $cache_url;                 // Адрес для сохраниения кэшированых файлов

 var $time_diff;                 // Через какой промежуток времени кэшировать

 var $its_all_cache_ok;

 var $fullpath;

 function CacheGo($urlsite,$time_for_cache,$path) {

   $this->cacheurl="cache_".md5($urlsite);

   $this->fullpath=$path.$this->cacheurl;

   $this->time_diff =time()-@filemtime ($this->fullpath);

   if ($this->time_diff < $time_for_cache){

    include ($this->fullpath);

    $this->its_all_cache_ok=1;

  }

 }

 function CacheInitial() {

   ob_start();

 }

 function CacheClr() {

   ob_end_clean();

 }

 function CacheGet () {

   $this->cache_cont = ob_get_contents();

   return $this->cache_cont;

 }

 function CacheInpAndWr() {

  echo $this->cache_cont;

  $fp = @fopen ($this->fullpath, "w");        // Открываем файл на запись

  @fwrite ($fp, $this->cache_cont);           // Записываем кешируемую информацию в файл

  @fclose ($fp);                              // Закрываем файл

 }

}

?>

А использовать класс очень просто, в том месте где вы подгружаете файл или модуль:

Вместо

<?php

include 'sidebar.php';

?>

Пишем

<?php

$cl_cache = new cache();

// Кэширование бокового сайдбара

$cl_cache->CacheGo($_SERVER['REQUEST_URI'], 3600, rtrim($_SERVER['DOCUMENT_ROOT'],'/')."/cache/");

if ($cl_cache->its_all_cache_ok != 1) {

  $cl_cache->CacheInitial();

  include 'sidebar.php';

  $cl_cache->CacheGet();

  $cl_cache->CacheClr();

  $cl_cache->CacheInpAndWr ();

}

unset($cl_cache);

?>

В функцию CacheGo мы передаем три параметра:

Первый параметр – текущая(кэшируемая) страница, или другой любой уникальный идентификатор для данного кэша. К примеру можно взять не только текущий адрес (URL), но и например текущий раздел. Если этот блок одинаковый для всех страниц, то просто пропишите название раздела, например «main_content».

Второй — время в секундах, на какое мы закэшируем блок. 3600 секунд это один час.

Третий — Путь, где будет храниться кэш вывода скрипта. Не забудьте поставить права на папку 777.

Скрипт работает очень просто.

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

А так-же я думаю вам пригодиться как сделать вывод в php date на русском в вашем проекте.

Надеюсь этот класс окажется для вас полезным.

Примечание: если ваш хостинг поддерживает к примеру APC, вы можете использовать его — подробнее (это может быть быстрее чем работа с файлами).
Кроме этого можно использовать WP Transients API для сохранения в базе данных информации с ограниченным сроком действия (например выборка самых популярных постов) — подробнее.

  • Леонид

    Спасибо за статью, всегда рад почитать вас!

  • что-то в этом есть, безусловно

  • Фарх

    Здравствуй! Спасибо за полезную статью!

    Слышал что если хорошо ускорить сайт, можно получить PR!

  • Andrews32

    Попробовал ваш скрипт:
    Создал папку cache, выставил права 777.
    Вместо
    прописал как у вас сказано.
    Содержимое countеrs.php заключено в div co своим ID.
    Получил ошибку:
    Parse error: syntax error, unexpected T_STRING in /var/www/vhosts/site.ru/index.php on line 263
    263-я строка: if ($cl_cache->its_all_cache _ok!=1) {

    «И так, привожу сразу листинг самого класса» — что с этим нужно было сделать? Засунуть в /cache/index.php ?

    • Здравствуйте!

      if ($cl_cache->its_all_cache _ok!=1) {
      

      Попробуйте написать «its_all_cache _ok» слитно, думаю в этом проблема.

  • Андрей

    нет

  • Кодим, кодим

    Немного допилил под себя, работает норм, но нужно избегать @ в коде … думаю в курсе …
    а в остальном СПС.