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'
    )
));

Condividi questo post


Commenti