CakePHP: Usar caché en el modelo
Posted by faemino | Filed under CakePHP
Podemos aprovecharnos del sistema de caché que viene por defecto en CakePHP, pensado sobre todo para las vistas, para almacenar de forma estática en un fichero información obtenida desde el modelo para tratar de minimizar los accesos a Base de Datos.
Trataré de explicarme mediante un ejemplo.
Pongamos un modelo News que tiene un método getLastNews que obtiene las últimas noticias creadas:
class News extends AppModel {
var $name = 'News';
function getLastNews(){
$find_params = array('limit' => 5, 'order' => 'News.id DESC');
$this->find('all', $find_params);
}
}
El código anterior obtendría las últimas 5 noticias y cada vez que se llame a este método se genera una consulta a la Base de Datos.
Ahora haremos unas modificaciones para generar un caché con estas últimas 5 noticias:
class News extends AppModel {
var $name = 'News';
function getLastNews(){
$data = $this->_getCache('ultimas-noticias');
if ( empty( $data ) ){
$find_params = array('limit' => 5, 'order' => 'News.id DESC');
$data = $this->find('all', $find_params);
$this->_toCache('ultimas-noticias', $data);
}
return $data;
}
function _toCache($cache_file_name = null, $data = null) {
if(! $cache_file_name) return false;
if(! $data) return false;
Cache::config(null, array('engine' => 'File', 'path'=> CACHE . '/data/'));
Cache::write($cache_file_name, $data, array('duration' => 7200, 'config' => null));
return true;
}
function _getCache($cache_file_name = null){
$data = null;
if(! $cache_file_name) return $data;
Cache::config(null, array('engine' => 'File', 'path' => CACHE . '/data/');
$data = Cache::read($cache_file_name);
return($data);
}
}
El código es mejorable, como poner los métodos de acceso a caché en el app_model, pero éste nos sirve para ver de un vistazo el funcionamiento del caché.
Ahora el método getLastNews, para obtener la información comprueba si existe en el caché, usándolo si existe y en caso contrario, consultando a la Base de Datos y creándolo para el futuro.
Para profundizar en el concepto del caché, su uso y configuración lo mejor es darse una vuelta por la documentación oficial.
Esta “técnica” se complementa muy bien con la reescritura de la callback find.