Cache

Материал из Wiki

Перейти к: навигация, поиск

Содержание

Cache

Библиотеку можно использовать для кэширования чего угодно на некоторое время или перманентно.

Примеры

Кэширование на некоторое время

if(!$data = $this->cache->load('taglist', 'view', 7200)){
  $this->load->model('post');
  $tags = $this->post->getTagList();
  $data = $this->load->view('taglist/index', array('tags' => $tags), true);
  $this->cache->save($data, 'taglist', 'view');
}
echo $data;

Код

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
 /**
  * Файловый кэш с поддержкой пространств имён.
  * @uses PHP5
  * @author Alexander Makarov (http://rmcreative.ru/)
  * @version 0.9
  */
 if(!defined('DS')) define('DS', DIRECTORY_SEPARATOR);
 class Cache {  
   /**
    * Сохранить данные в кэш
    *
    * @param mixed $data данные
    * @param string $namespace пространство имён
    * @param string $id идентификатор
    */
   function save($data, $namespace, $id){
   	$storage = array(
 		'data' => $data,
 		'timestamp' => time()
 	);
 	$path = $this->get_namespace_path($namespace).$this->get_id_dir($id);
 	if(!file_exists($path)){
 		mkdir($path, 0775, true);
 	}
   	file_put_contents($path.md5($id), serialize($storage));
   }
  
   /**
    * Сохранить данные из кэша
    *
    * @param string $namespace пространство имён
    * @param string $id идентификатор
    * @param int $lifetime время жизни
    * 
    * //TODO: проверять время жизни не загружая файл
    */
  
   function load($namespace, $id, $lifetime = 0){
   	$filename = $this->get_namespace_path($namespace).$this->get_id_path($id);
   	if(!file_exists($filename)) return false;
   	  	
   	$data = unserialize(file_get_contents($filename));
   	if(empty($data['timestamp'])) return false;
 	
   	//истекло ли время жизни?
   	if(($lifetime != 0) && (($data['timestamp']+$lifetime)<time())){
 		$this->remove($namespace, $id);
 		return false;
 	}
   	return $data['data'];
   } 
 
   /**
    * Удаляем данные из кэша
    *
    * @param string $namespace пространство имён
    * @param string $id идентификатор
    */
   function remove($namespace, $id){
   	$filename = $this->get_namespace_path($namespace).$this->get_id_path($id);
   	if(file_exists($filename)) unlink($filename);
   }
 
   /**
    * Удаляем всё пространство имён
    *
    * @param string $namespace пространство имён
    */
   function clean($namespace){
     $CI = &get_instance();
     $CI->load->helper('file');
     $CI->delete_files($this->get_namespace_path($namespace), true);
   }
  
   /**
    * @param string $id идентификатор
    * @return string
    */
   private function get_id_path($id){
 	return $this->get_id_dir($id).md5($id);
   }
  
  
   /**
    * @param string $id
    * @return string
    */
   private function get_id_dir($id){
   	$hash = md5($id);
 	return $hash[0].DS.$hash[1].DS.$hash[2].DS.$hash[3].DS.$hash[4].DS.$hash[5].DS;
   }
 
   /**
    * @param string $namespace пространство имён
    * @return string
    */
   private function get_namespace_path($namespace){
   	return APPPATH.'cache'.DS.'namespaces'.DS.$namespace.DS; 
   }
 }
Источник — «http://code-igniter.ru/wiki/Cache»
Личные инструменты