Home > database | php > CakePHP: caching semi automatico delle query tramite AppModel

CakePHP: caching semi automatico delle query tramite AppModel

23 gennaio 2012 No Comments

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

Tags: cache cakephp database php

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

*

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>