PHP: Создание примитивного кеширования со временем жизни

Сегодня я решил рассказать о самом простом способе кеширования данных на Вашем сервере.
Всем известно, что кеш — очень полезная вещь, которая очень сильно разгружает Ваш сервер. Сейчас очень популярен memcache — библиотека для серверов, которая способна хранить любые данные определенный период времени. Работает он достаточно быстро и пользоваться им очень легко. Единственный минус, что он есть не на всех серверах (хотя на самом деле встретить хостинг без memcache сейчас очень сложно).

Однако мы будем говорить о своей реализации кеширования. Реализовать самый примитивный кеш можно либо с использованием базы данных, либо используя файловую систему (т.е. файлы). Мы будем говорить о втором варианте. Почему? Потому что чтобы работать с ним — не нужно знать данные для подключения к базе, а значит скрипт становится более гибким. Однако есть и минусы. Главный из них — медленная работа и нагрузка на жесткий диск.

Приступим к кодингу…


define('CACHE_FOLDER', __DIR__.'/cache/'); //определим константу с путем для файлов кеша

function create_cache_file($cacheName, $content, $timeLife = '+1 hour')
{
   //$timeLife время жизни кеша в формате функции strtotime

   if(!is_dir(CACHE_FOLDER)) {
      mkdir(CACHE_FOLDER, 0777); //создаем папку для файлов кеша, если ее еще нет
   }

   $cache = CACHE_FOLDER.$cacheName.'.txt'; //имя файла с кешем
   $cacheTime = CACHE_FOLDER.$cacheName.'_time.txt'; //имя файла с временем жизни кеша

   file_put_contents($cache, $content); //сохраним данные
   file_put_contents($cacheTime , strtotime($timeLife)); //сохраним время окончания жизни кеша
}

function read_cache_file($cacheName)
{
   $cache = CACHE_FOLDER.$cacheName.'.txt'; //имя файла с кешем
   $cacheTime = CACHE_FOLDER.$cacheName.'_time.txt'; //имя файла с временем жизни кеша
   if(file_exists($cache) && file_exists($cacheTime)) { //кеш создан
      if((int)file_get_contents($cacheTime) > time()) { //если кеш еще не просрочен
          return file_get_contents($cache); //возвращаем содержимое файла кеша
      }
   }
   return null; //кеша нет или он просрочен   
}

Пример:

$data = '';
$cacheName = 'cacheSample';
if(($data = read_cache_file($cacheName)) === null) { //если кеша нет или он просрочен
   $data = SOME_LONG_hARD_FUNCTION(); 
   create_cache_file($cacheName, $data, '+1 day'); //сохраним данные в кеш
}
echo $data; //выводим результат
Запись опубликована в рубрике PHP с метками , , , , , , , . Добавьте в закладки постоянную ссылку.