![]()
El concepto de cachear contenido es simple. Cada vez que generamos una pagina con contenido dinamicamente con PHP, lo que hacemos desde el lado del servidor es procesar los .php, estos generalmente tienen cierta logica, para generar el contenido que vamos a mostrar, como buscar en la base datos, llamar algun webservice, y depende el sistema mas o menos cosas. Con Zend_Cache nos evitamos de estos pasos.
Lo que hacemos con Zend_Cache, es generar el html(xml, json, etc) final, y almacenarlo en el file system. De esta manera cada vez que hagamos llamen a nuestra web vamos a llamar a nuestro html final, y no volver a generar el html que generamos en peticiones anteriores. Esto sirve para web donde el contenido no cambia constantemente.
Por ejemplo si tuvieramos un diario, como www.clarin.com.ar donde acceden millones de personas mensualmente, pero sabemos que el unico momento donde se cambia la portada es cuando aparece una nueva nota, aunque las paginas internas siguen siendo las mismas.
Para este caso es ideal algo como Zend_Cache, podemos Cachear toda portada, y cada una de las paginas internas, si desde la administracion se carga una nueva nota, se borra el cache anterior y se genera uno nuevo muy facilmente.
Pero hasta ahora solo vimos la teoria.
Manos a la obra
Lo primero que tenemos que hacer antes de cachear nuestras paginas es configurar como queremos que funcione Zend_Cache. En este ejemplo le vamos a dar un tiempo de vida determinado, vamos a indicarle donde queremos que almacene las paginas cacheadas, y vamos a decirle que actions y vistas queremos que cachee. Este codigo podemos ponerlo en nuestro bootstrap.
/**
* You should avoid putting too many lines before the cache section.
* For example, for optimal performances, "require_once" or
* "Zend_Loader::loadClass" should be after the cache section.
*/
$frontendOptions = array(
‘lifetime’ => 7200,
‘debug_header’ => true, // for debugging
‘regexps’ => array(
// cache the whole IndexController
‘^/$’ => array(‘cache’ => true),
// cache the whole IndexController
‘^/index’ => array(‘cache’ => true),
‘^/home’ => array(‘cache’ => true),
// we don’t cache the ArticleController…
// we don’t cache the ArticleController…
‘^/news’ => array(‘cache’ => true),
// we don’t cache the ArticleController…
// … but we cache the "view" action of this ArticleController
‘^/news/list/view’ => array(
‘cache’ => true
)
),
‘default_options’ => array(
‘make_id_with_post_variables’ => true,
‘make_id_with_cookie_variables’ => true,
‘cache_with_cookie_variables’ => true
)
);
$backendOptions = array(
‘cache_dir’ => ‘/tmp/zend_cache’
);
// getting a Zend_Cache_Frontend_Page object
$cache = Zend_Cache::factory(‘Page’,
‘File’,
$frontendOptions,
$backendOptions);
$cache->start();
?>
En este ejemplo estamos cacheando los controller news, home, index. Ademas le indicamos que el directorio para los files es /tmp/zend_cache (hay que crearlo!!)
Los tiempos que se reducen dependen de la cantidad de datos que busquemos en la base de datos, webservice, o que dependa de cierta logica.
Para un blog, o un portal con muchos hits diarios esto es indispensable al menos que tengamos hardware de sobra. En este blog yo uso WP-Cache de Ricardo Galli que hace lo mismo que Zend_Cache.
