Для очередного клиента разрабатывал интернет-магазин запчастей. Каталога как такового там не было, однако была куча поставщиков, подключенных через API.
Так как клиентов планировалось много, то постоянное обращение к API было бы слишком затратно для сервера.
В рамках этого проекта был написан простой класс, который позволяет кэшировать данные, полученные в ходе каких-либо операций в файл и использовать их в любое удобное время с минимальной задержкой.
Вот он:
<?php /* Класс для кэширования данных Роман Сергеевич Гринько rsgrinko@gmail.com */ class CCache{ private static $cache_dir = '/cache_folder/'; public static function init($dir){ self::$cache_dir = $dir; } public static function checkCache($name){ // Проверка наличия элемента в кэше if(file_exists($_SERVER['DOCUMENT_ROOT'].self::$cache_dir.md5($name).'.tmp')){ return true; } else { return false; } } public static function getCache($name){ // Получить элемент из кэша if(self::checkCache($name)){ return unserialize(base64_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'].self::$cache_dir.md5($name).'.tmp'))); } else { return false; } } public static function writeCache($name, $arValue){ // Записать элемент в кэш if(file_put_contents($_SERVER['DOCUMENT_ROOT'].self::$cache_dir.md5($name).'.tmp', base64_encode(serialize($arValue)))){ return true; } else { return false; } } public static function clearCache(){ // Очистить кэш foreach(scandir($_SERVER['DOCUMENT_ROOT'].self::$cache_dir) as $file){ if($file == '.' or $file == '..') continue; if(!unlink($_SERVER['DOCUMENT_ROOT'].self::$cache_dir.$file)){ return false; } } return true; } public static function delFromCache($name){ // Удалить элемент из кэша if(self::checkCache($name)){ if(!unlink($_SERVER['DOCUMENT_ROOT'].self::$cache_dir.md5($name).'.tmp')){ return false; } } return true; } public static function getSize($name){ // Получить размер элемента в кэше if(self::checkCache($name)){ return $_SERVER['DOCUMENT_ROOT'].self::$cache_dir.md5($name).'.tmp'; } return true; } public static function getCacheSize(){ // Получить размер кэша $return_size = 0; foreach(scandir($_SERVER['DOCUMENT_ROOT'].self::$cache_dir) as $file){ if($file == '.' or $file == '..') continue; $return_size = $return_size + filesize($_SERVER['DOCUMENT_ROOT'].self::$cache_dir.$file); } return $return_size; } public static function ageOfCache($name) { // Получить возраст элемента кэша if(self::checkCache($name)){ return (time() - filectime($_SERVER['DOCUMENT_ROOT'].self::$cache_dir.md5($name).'.tmp')); } else { return false; } } } ?>
Несмотря на малое количество строк кода, он с легкость решает поставленную задачу, а именно:
- Проверка наличия кэша элемента
- Получение элемента из кэша
- Запись элемента в кэш
- Удаление элемента из кэша
- Очистку кэша
- Получение размера кэша
- Получение размера конкретного элемента в кэше
Все методы класса являются статическими, поэтому создавать экземпляр класса не требуется.
Ниже я приведу полное описание всех доступных методов.
CCache::init(‘/folder/’);
Установка дирректории для хранения кэша. Указывать со слешами в начале и в конце.
CCache::checkCache($name);
Выполняет проверку наличия кэша в базе. Принимает в качестве аргумента идентификатор элемента $name. Если элемент присутствует в кэше — вернет true, иначе — false.
CCache::getCache($name);
Получает элемент из кэша, возвращает массив. Если элемент в кэше не найден — вернет false.
CCache::writeCache($name, $arValue);
Запись данных в кэш. Принимает два аргумента: имя элемента $name и данные $arValue. В свою очередь данные $arValue должны являться массивом. При наличии элемента в кэше он будет перезаписан.
CCache::clearCache();
Метод полностью очищает кэш. Вернет false в случае ошибки.
CCache::delFromCache($name);
Метод удаляет конкретный элемент из кэша, принимает имя элемента $name в качестве аргумента. Вернет false в сллучае ошибки удаления.
CCache::getSize($name)
Метод возвращает размер элемента $name в байтах. Если элемент в кэше не найден — вернет false.
CCache::getSize($name)
Метод возвращает размер кэша в байтах