Кэширование данных в PHP на примере класса (Рейтинг: +3)

Печать RSS
Для очередного клиента разрабатывал интернет-магазин запчастей. Каталога как такового там не было, однако была куча поставщиков, подключенных через API.
Так как клиентов планировалось много, то постоянное обращение к API было бы слишком затратно для сервера.
В рамках этого проекта был написан простой класс, который позволяет кэшировать данные, полученные в ходе каких-либо операций в файл и использовать их в любое удобное время с минимальной задержкой.
Вот он:
<?php
	/*
		Класс для кэширования данных
		Роман Сергеевич Гринько
		rsgrinko@gmail.com
		https://it-stories.ru
	*/
class CCache{
	private static $cache_dir;
	
	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)
Метод возвращает размер кэша в байтах

Небольшой пример использования:
<?php
require_once __DIR__.'/classes/CCache.php';

CCache::init('/cache/'); // устанавливаем дирректорию для кэша

// проверяем есть ли элемент в кэше и время его существования меньше часа
if(CCache::checkCache('test') and CCache::ageOfCache('test')<3600) {
  $var = CCache::getCache('test'); // получаем элемент из кэша
} else { // При отсутствии элемента в кэше 
  $var = $_SERVER; // Выполняем действия для получения этого элемента
  CCache::writeCache('test', $var); // Пишем результат в кэш
}

Добавил:
Рейтинг: +3
Просмотры: 1458
Комментарии (0) »