Trucos para Smarty: 2. Usa el cache
Por más sencillo o “light” que sea tu sitio web, hay un punto en que con alto tráfico, las visitas comienzan a ser un problema en varios frentes:
- Servidor Web: Smarty es muy extensible, pero afrontémoslo… no es ligero. Las grandes libertades que te ofrece vienen con un coste: CPU, memoria y acceso a disco (por lo general carga muchos archivos, sobre todo en la etapa de compilación).
- Bases de Datos: Suelo ser un cuello de botella, y si tienes algunos procesos que sean intensivos en datos puede hacer que tus servidores se arrodillen pidiendo perdón.
Para esto existe el Cache.
El uso del Cache es bastante claro para páginas que no cambien con frecuencia, de hecho con la clase que creamos en el artículo anterior, es muy sencillo, ya que es un parámetro a la hora de instanciar la clase.
Sin embargo, el uso del Cache no sólo se limita a páginas estáticas o casi estáticas. Hay un par más de casos (entre otros que ahora no se me ocurren) en el que es útil:
- Si la información no debe ser “real time”
- Para hacer que páginas estáticas se vuelvan estáticas.
Una buena opción para el uso del cache es cuando tienes una página cuyo contenido es dinámico, pero que no importa si tiene un par de minutos de “retraso. Por ejemplo, un listado de noticias, etc.
En este caso, nos basta con indicarle al Smarty que sí deseamos utilizar el cache y decirle cada cuánto queremos que refresque el contenido.
Por ejemplo, supongamos que tenemos un PHP que saca el listado de las últimas noticias y lo muestra. Sin el caché sería así (simplificando un poco el código):
Archivo: DOCROOT/pubs/ejemplo2.php
<?php require_once 'classes/db/News.php'; require_once 'classes/template/MySmartyBasic.php'; $news = News::getLatestNews(); $tpl = new MySmarty(); $tpl->assign('news', $news); $tpl->display('ejemplo2.tpl'); ?>
Archivo: DOCROOT/confs/ejemplo2.conf
latest_news=Últimas Noticias
Archivo: DOCROOT/templates/ejemplo2.tpl
{config_load file="ejemplo2.conf"} <html> <head> <title>{#lates_news#}</title> <style> {literal} BODY { font-family:Arial, sans; } h1 { border: 1px black solid; background-color:#dddddd; margin:5px; padding:6px; } div, div.dark { white-space:nowrap; overflow:hidden; padding:5px; margin: 5px 10px 0px 10px; } div.dark { background-color:#eeeeee; } {/literal} </style> </head> <body> <h1>{#latest_news#}</h1> {foreach from=$news item="new"} <div {cycle values=",class='dark'"}> <a href="{$new.url}">{$new.title}</a>: {$new.description} </div> {/foreach} </body> </html>
Para utilizar el caché, basta con modificar el php de la siguiente forma:
Archivo: DOCROOT/pubs/ejemplo2.1.php
<?php require_once 'classes/db/News.php'; require_once 'classes/template/MySmartyBasic.php'; $tpl = new MySmarty(2); // Para asegurarnos de usar el cache. $tpl->cache_lifetime = 5*60*60; // Regenerar cada 5 minutos if (!$tpl->is_cached('ejemplo2.tpl', 'latest_news')) { // Colocamos el acceso a la BD dentro del if para evitarlo $news = News::getLatestNews(); $tpl->assign('news', $news); } $tpl->display('ejemplo2.tpl', 'latest_news'); ?>
y listo, el caché se refrescará cada 5 minutos.
Un ejemplo de hacer que el contenido dinámico se vuelva estático sería en este caso apropiado para la página que muestra la noticia. En este caso nos basta con modificar el PHP que muestra la noticia para que utilice el caché (como hicimos en el caso anterior), pero incluyendo el identificador de la noticia como parte del “cache_id”. Podría quedar así:
Archivo: DOCROOT/pubs/ejemplo2.2.php
<?php require_once 'classes/db/News.php'; require_once 'classes/template/MySmartyBasic.php'; $new_id = $_GET['id']; if (!is_numeric($new_id)) die("new_id debe ser un número"); // Para asegurarnos de usar el cache y que nunca expire $tpl = new MySmarty(-1); $cache_id = 'news' . $new_id; if (!$tpl->is_cached('ejemplo2.2.tpl', $cache_id)) { // Colocamos el acceso a la BD dentro del if para evitarlo $the_news = News::getNews($new_id); if ($the_news === false) die("News id $new_id doesn't exist"); $tpl->assign('the_news', $the_news); } $tpl->display('ejemplo2.2.tpl', $cache_id); ?>
Y listo!
Recuerda con el uso del cache algunas cosas importantes:
- No lo uses en desarrollo, te ahorrarás muchos dolores de cabeza.
- Ten cuidado con el manejo de errores, no quieres que si al generar la página ocurre algún error, ese error quede perpetuado en la versión cacheada. Tip: si detectas un error deshabilita el cache.
- Si necesitas forzar que una versión en caché sea regenerada tienes dos opciones: eliminar el archivo de la carpeta cache (el nombre del archivo incluye el cache_id); o utiliza la función clear_cache recordando de indicarle el cache_id.
- Si realizas algún cambio en el .tpl en el que se basa un cache, automáticamente todas las versiones cache-adas de ese .tpl quedan invalidadas y deberán ser regeneradas.
- Si debes cambiar el tpl y temes el impacto que regenerar el cache pueda tener en tu servidor, puedes regenerar las versiones cache en un ambiente anterior al de producción (stage) y subirlas junto con el tpl cuando estés publicando el cambio. En este caso ten mucho cuidado con las fechas de modificación de los archivos, las versiones cache deben ser posteriores al tpl o serán inválidas (un touch puede servir, o simplemente usa rsync).
sin comentarios... »
No comments yet.
RSS feed de los comentarios. TrackBack URL
deja un comentario