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;
}
}