cacheando queries de forma facil

Idea original tomada de: http://www.endyourif.com/caching-queries-in-cakephp/

Una optimizacion comun es cachear queries… navegando por ahi me encontre con un articulo donde simplemente reescriben el metodo find de los modelos para cachear las queries, lo modifique un poquito y asi quedo;

app_model.php

class AppModel extends Model {
	/**
	 * 
	 * Cache find queries
	 */ 
    function find($conditions = null, $fields = array(), $order = null, $recursive = null) {
    	if (!empty($fields['cacheKey'])) {
    		$cacheConfig = 'query';
			if (!empty($fields['cacheConfig'])){
      			$cacheConfig = $fields['cacheConfig'];
    		}
    		
    		$cacheName = $this->name . '-' . $fields['cacheKey'];
			
    		if (($data = Cache::read($cacheName, $cacheConfig)) === false) {
				$data = parent::find($conditions, $fields, $order, $recursive);
				Cache::write($cacheName, $data, $cacheConfig);
			}
    	}else{
    		$data = parent::find($conditions, $fields, $order, $recursive);
    	}
    	
    	return $data;
    }
}

Como veran por defecto usa la configuracion de cache llamada ‘query’, asi que vamos a tener que agregar esto en;

config/core.php

Cache::config('query', array(
 'engine' => 'File',
 'duration'=> '+20 minutes',
 'probability'=> 100,
 'path' => CACHE . 'queries' . DS,
 ));

Ademas tendremos que crear en el directorio de cache el directorio queries, alli se salvaran todas las queries, si en vez de usar el file engine podemos cambiarlo por memcache tocando la configuracion (lo que recien escribimos en core.php).

USO

Cuando queremos cachear un find solo agregamos lo siguiente al array options;

$this->Modelo->find('all',array('cacheKey'=>'llave','conditions'=>2));
$this->Modelo->find('all',array('cacheKey'=>'llave','cacheConfig'=>'memcached','conditions'=>2));

PAZ!

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s