Кэширование данных в PHP на примере класса

Кэширование данных в PHP на примере класса

Для очередного клиента разрабатывал интернет-магазин запчастей. Каталога как такового там не было, однако была куча поставщиков, подключенных через 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)

Метод возвращает размер кэша в байтах