Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/08/2008, 01:21
rallibau
 
Fecha de Ingreso: agosto-2007
Mensajes: 14
Antigüedad: 17 años, 3 meses
Puntos: 0
Respuesta: Dudas sobre Zend Cache

Hola,

Hace tiempo implemente un sistema de cache para mi web usando Zend_cacbe(los1000hijos.com). En el codigo del controlador cuya respuesta html quieres cachear tienes que hacer,con la cache debidamente inicializada:

Código PHP:
$cache->start(); 
La cache indexa las paginas según la url y otras factores configurables(sesión, cookies, etc). Es decir genera una pagina en cache para www.miserver.com y otra para www.miserver.com/noticias . Si miras el código del método start() verás que si encuentra una página valida lo último que hace es un die(), por este motivo el resto del código del controlador no se ejecuta. Este es mi controlador cacheado:


Código PHP:
public function indexAction()
    {
        
$ctx Zend_Registry::get('ctx');
        
$ctx->cacheStart();
        
$config =  Zend_Registry::get('config');
        
$sesion = new Zend_Session_Namespace($config->site->name);
        
$path $config->site->modulespath;
        
$blog = new Blog();
        
$respuesta $blog->seeNews();
        
$output prePage("blog");
        
$vista = new Zend_View();
        
$vista->setScriptPath($path."blog/views");
        if(
$respuesta->arrayNodos){
            
$output .= $vista->render("publileft.php");
            
$output .= '<div class="column span-17 last">';
            foreach(
$respuesta->arrayNodos as $indice => $nodo){
                
$vista->nodo $nodo;
                
$vista->baseUrl $config->site->webhost;
                
$vista->session $session;
                
$output .= $vista->render("divnew.php");
                }
        }
        
$output .= '</div>';
        
$output .= postPage();
        echo 
$output;
   } 
La clave está en que cuando haya un cambio en los datos(un input en la bbdd), has de invalidar las páginas de cache que puedan ser afectadas, si no los cambios en la permanencia no se reflejarán:

Código PHP:
$cache->clean(); 
La otra clave es inicializar bién la cache para que cachee correctamente las diferentes versiones de la pagina. Si a diferentes usuarios diferentes paginas, usa la sesión para diferenciar la página. Este es el código que inicializa mi cache:

Código PHP:
public function cacheInit(){
        if(
$this->enable != "true")
            return;
        try{
            
$config =  Zend_Registry::get('config');
        }
        catch(
Exception $e){
            throw new 
Zend_Exception('Se ha intentado inicializar la cache sin crear el objeto config');
        }
        
$time 86400;
        
$baseuri $config->cache->baserequesturi;
        
$frontendOptions = array(
              
'lifetime' => $time,
           
'debug_header' => true// for debugging
           
'default_options' => array(
           
'cache_with_session_variables' => true,
           
'make_id_with_cookie_variables' => false,
           
'make_id_with_session_variables' => true,
           
'cache_with_cookie_variables' => true
            
),
           
/*'regexps' => array(
               '^'.$baseuri => array('cache' => true),         // cache the whole IndexController
               '^'.$baseuri.'index/' => array('cache' => true),    // cache the whole IndexController
           )*/
        
);
        
$backendOptions = array('cache_dir' => './contexto/cache');
        
$this->cache Zend_Cache::factory('Page''File'$frontendOptions$backendOptions);
    
    } 
Como ves la definió para que use las variables de la sesión, además de la url, para generar la id de la página. Para ver una ejemplo funcionando visita los1000hijos.com. Al final de la pagina verás un pequeño flag amarillo que indica que la pagina está cacheada