Mejorando el rendimiento de mi eZ Publish (II)
Clasificado bajo perfomance, viewcaching | Sin comentarios
Hace unas semanas hacíamos una pequeña introducción al sistema de caches que eZ Publish trae por defecto. Hoy nos vamos a centrar en uno de esos caches, en concreto el Caché de contenido o ViewCaching.
Lo primero que hemos de tener en cuenta es que el ViewCaching, normalmente, no cachea las páginas en su totalidad, sino una parte más o menos grande de ellas. Lo que puedes meter en este caché depende fundamentalmente de la estructura del site en el que estás trabajando. Básicamente, deberías pensar que el ViewCaching está pensado para las partes de las páginas que no son comunes entre sí. Veamos un ejemplo con la estructura de nuestro blog.
Como podrás ver, tenemos 4 partes bien diferencias. A una de ellas la hemos marcado en rojo y es nuestra zona de "Contenido". Si navegas un poco por nuestro blog verás que las otras tres partes se mantienen fijas y solo la parte central es la que se diferencia entre unas partes y otras.
Con ese dibujo en mente construimos nuestro pagelayout.tpl que, de forma esquemática es más o menos como sigue.
<html>
<head>
</head>
<body>
<div id="header">...</div>
<div id="bodyContent>
<div id="sideBar">...</div>
<div id="content">{$module_result.content}</div>
</div>
<div id="footer"></div>
</body>
</html>
Cuando lo que estamos haciendo es mostrando la información asociada a un nodo, eZ Publish ejecuta la vista "view" del módulo "content". Puedes probar http://www.unblogsobreez.com/content/view/full/312 para que te hagas una mejor idea de lo que estamos hablando. Aquí, eZ detecta la dirección pedida e internamente la convierte en esa otra dirección. Automáticamente se generará un array, $module_result que, entre otras cosas, contiene el código html o xhtml generado tras la conversión de las plantillas y consultas necesarias. Este código es accesible vía {$module_result.content}
Debes tener en cuenta que siempre tienes que usar {$module_result.content} en tu pagelayout, pero que de momento, solo cuando estemos accediendo a urls del tipo /content/view/full, el caché entrará en acción y que solo esa parte será cacheada. Es decir, todas las consultas necesarias para generar el pie, cabecear o zona lateral se ejecutarán siempre, aunque más adelante veremos que esto también se puede evitar usando otro tipo de cachés.
Como decíamos, al renderizar la página, el {$module_result.content} es sustituido por la salida xhtml correspondiente a esa parte de la página. Si el ViewCaching está activado, ese html será guardado en un archivo. En siguientes peticiones a la misma página, ez llamará directamente a este archivo evitando toda la carga de base de datos y procesos necesarios en php.
Has de tener en cuenta también que ez generá diferentes archivos cache para una misma página en función de ciertos parametros, tales como el usuario que está logueado, el idioma en el que se está viendo o cualquiera de los "View Parameters" que le pasemos. Esto permite que una misma página pueda ser vista de forma diferente por dos usuarios distintos sin que para ello tengamos que estar consultando una y otra vez a la base datos, o también mantener cacheados las distintas páginas de un listado de nodos, por ejemplo.
Vaciado de cache
Pero eZ Publish es, principalmente, un gestor de contenidos. Estamos hablando de que cuando una página se pide por primera vez se cachea para que en las siguientes peticiones nos ahorremos tiempo de proceso. Pongamos entonces el siguiente ejemplo. Supongamos que en nuestro arbol de contenidos tenemos una carpeta llamada "Noticias" cuyos hijos son las distintas noticias subidas por los editores. La página de noticias tiene un listado paginado de las mismas. ¿Qué ocurre cuando un editor añade o edita una noticia?. ¿No tendremos problemas ya que nuestra página de Noticias está "cacheada"? La respuesta es que no, ya que eZ Publish vacía algunos caches dependiendo de ciertas acciones. Una de esas acciones es la publicación de un contenido. Siempre que un contenido se publica todos los archivos de caches asociados a él expiran, pero además lo hacen sus "nodos padre" y aquellos que tienen los mismos tags e incluso los nodos que tienen relaciones (inversas o directas) con el editado.
De esta forma, para un site con una estructura típica de arbol, como la que se presenta en la figura, eZ Publish se encargará de forma automática de su cacheo con la consiguiente mejora en rendimiento.
Tu labor será aprovechar al máximo estos caches, lo cual no siempre es fácil. Con el ViewCaching activado, dejará de ejecutarse cualquier código php relacionado con esa parte de la página. Esto implica que deberás tener cuidado cuando tus páginas comiencen a tener más funcionalidades, tipo votaciones por ip o dependan de otras páginas que no estén en la misma rama del árbol de contenido. Veremos ejemplos en próximos post.