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