Сегодня я решил рассказать о самом простом способе кеширования данных на Вашем сервере.
Всем известно, что кеш — очень полезная вещь, которая очень сильно разгружает Ваш сервер. Сейчас очень популярен 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; //выводим результат