CakePHP: caching semi automatico delle query tramite AppModel
ATTENZIONE!
Il post ha più di 2 anni e le informazioni contenute
potrebbero essere obsolete (ad esempio a causa di un
aggiornamento di versione rispetto agli elementi descritti
o links modificati da siti esterni).
In un precedente articolo è stata mostrata una semplice struttura per salvare i dati in cache da controller. Per automatizzare questa funzionalità e scrivere meno codice è possibile centralizzare le funzioni necessarie all'interno della classe AppModel. La classe contiene:
- una variabile $cache_key per impostare la chiave per il salvataggio in cache
- una funzione findCached() da richiamare con gli stessi parametri della funzione find() standard che ritorna i risultati salvati in cache oppure, nel caso in cui non ci siano risultati salvati, esegue la funzione find()
- il callback afterFind() per salvare i risultati in cache dopo la prima esecuzione della query
Ed ecco la classe completa con i commenti necessari per comprenderne il funzionamento:
/**
* CakePHP AppModel
* @author Emanuele
*/
class AppModel extends Model{
var $cache_key = false;
/**
* Funzione di ricerca con utilizzo della cache.
* Accetta gli stessi parametri della funzione find().
*
* @param String $type first, all, ...
* @param Array $params Array con parametri
*/
function findCached($type = 'all', $params = array()){
//se è impostata una chiave per la cache provo a recuperare i risultati in cache
if(isset($this->cache_key)){
if($this->cache_key && ($this->cache_key!='')){
//imposta id della cache
$cache_id = $this->cache_key;
Cache::set(array('prefix' => Configure::read('Config.language').'_mycache_'));
//cerca risultati in cache
$cached_items = Cache::read($cache_id);
//se ci sono risultati in cache
if($cached_items){
return $cached_items;
}
}
}
//se non c'è niente in cache esegue un find() standard
return $this->find($type, $params);
}
/**
* Funzione richiamata dopo ogni ricerca in DB.
*
* @param Array $results Risultati della ricerca
* @return Array Risultati della ricerca eventualmente ricavati dalla cache
*/
function afterFind($results){
if($results){
//caching dei risultati
//se è impostata una chiave per la cache provo a scrivere i risultati in cache
if(isset($this->cache_key)){
if($this->cache_key && ($this->cache_key!='')){
//imposta id della cache
$cache_id = $this->cache_key;
Cache::set(array('prefix' => Configure::read('Config.language').'_mycache_'));
//scrittura dei risultati
$is_cache_written = Cache::write($cache_id, $results);
}
}
}
//ritorna i risultati
return($results);
}
}
All'interno di un controller si dovrà scrivere il seguente codice per utilizzare le funzionalità introdotte tramite l'AppModel:
$this->Post->cache_key = 'nome_della_chiave';
$post = $this->Post->findCached('all');
Ovviamente è possibile passare anche altri parametri alla funzione di ricerca come si farebbe per la funzione find():
$this->Post->cache_key = 'nome_della_chiave';
$post = $this->Post->findCached('all',array(
'conditions' => array(
'Post.lang' => 'ita',
'Post.published' => 1
),
'order' => array(
'Post.created ASC'
)
));
Applicare sconti su tutti i prodotti di una categoria in Prestashop
Ricavare la lista dei layers da Geoserver

Commenti