:::: MENU ::::

Uso de la caché de bloques de Magento

Uso de la caché de bloques de Magento
1 voto, 5.00 media (82% puntos)

En muchas, muchas ocasiones, nos llegan peticiones de optimizaciones de tiendas Magento en las que se pretende comenzar la casa por el tejado… me explico…

Es bastante habitual que alguien llame a la oficina y nos pida presupuesto para instalar Varnish en su servidor, porque han oído por ahí que el conjunto Magento + Varnish tiene un rendimiento mucho mejor que Magento por separado y que los tiempos de carga de página mejoran muchísimo.

Esto es cierto, como ya he comentado en otros artículos, pero igualmente no nos cansamos de repetir que Varnish no es la solución inicial que debe plantearse. Lo primero es tener un buen desarrollo de la tienda, optimizada al máximo para consumir pocos recursos del servidor. Una vez hecho esto y si aun así por el número de visitas, necesitamos más o queremos mejorar la velocidad de carga, será el momento de pensar en Varnish o sistemas similares.

En este artículo os enseñamos uno de los trucos para mejorar el desarrollo de las plantillas que realicéis en vuestras tiendas.

Sistema de caché de Magento

Magento, como todos sabéis, tiene un excelente sistema de caché, en el que se almacena toda la información de uso habitual (configuraciones, listas de atributos, etc.).

Lo que no sabe todo el mundo es que podemos utilizar este sistema de caché para nuestros propios propósitos.

Por ejemplo, imaginad que creamos un bloque de productos más vendidos en nuestra página home. Probablemente empezaremos creando un bloque como el siguiente:

    <block type="core/template" name="masvendidos" template="mymodule/masvendidos.phtml" />

Podemos almacenar el contenido del bloque en la caché de forma que no sea necesario calcular una y otra vez qué productos son los más vendidos. Lógicamente querremos actualizar el bloque en función de las ventas, pero seguramente no es necesario actualizarlo todas las veces que se cargue la home. Probablemente con actualizarlo una vez al día será suficiente.

Para ello solo tenemos que modificar la definición de nuestro bloque de la siguiente forma:

<block type="core/template" name="masvendidos" template="mimodulo/mitemplate">
    <action method="setCacheKey"><key>masvendidos</key></action>
    <action method="setCacheLifetime"><lifetime>86400</lifetime></action>
</block>

Con este simple cambio nuestro bloque quedará almacenado en la caché de Magento durante un día (86400 segundos), de forma que para todas las visitas que se reciban durante ese tiempo, el bloque no volverá a generarse, sino que se obtendrá de la caché.

Este ejemplo es muy sencillo y seguramente no nos aportará un gran beneficio en los tiempos de carga, pero pensad que esta estrategia puede aplicarse a TODOS los bloques de vuestra tienda, con lo que pensando muy bien dónde lo podemos aplicar, se pueden obtener una gran reducción de los tiempos de procesamiento.

En particular, en ciertos proyectos donde el contenido cumple una serie de normas, hemos llegado a cachear, por ejemplos, los listados de productos de las categorías, lo que supone una mejora considerable.

Parámetros de la cache de bloques de Magento

Además de los parámetros anteriores asignados al bloque, a continuación os incluimos unas ideas acerca de la definición de la caché y también de como liberarla.

Básicamente existen tres parámetros de la caché de bloques:

cache_lifetime. Es el tiempo en segundos que permanecerá el bloque en la memoria caché. Transcurrido ese tiempo, Magento descartará el bloque y en la siguiente carga de página volverá a generarse.

cache_key. Es el identificador de nuestro bloque en la memoria caché. Cuando un bloque va a generarse, se comprueba si ese bloque ya está en la cache y si lo está se toma el contenido de allí. El identificador debe ser un identificador único para el bloque.

cache_tags. Una lista de identificadores que permite configurar ante que eventos se debe descartar una copia almacenada en caché. Por ejemplo, si tenemos en caché una lista de productos pertenecientes a una categoría, probablemente querremos que al guardar esa categoría, el bloque se regenere para actualizar la posible nueva información.

Con estos tres parámetros podemos cubrir prácticamente todas las necesidades en cuanto a la gestión de la caché de bloques.

Ejemplo: caché en el bloque de productos nuevos

Como todos sabréis, existe en magento una sección de novedades, que se generan por medio del bloque <code>Mage_Catalog_Block_Product_New</code>.

Si miráis el contenido de este fichero, veréis en su constructor las siguientes líneas:

$this->addData(array(
    'cache_lifetime' => 86400,
    'cache_tags'     => array(Mage_Catalog_Model_Product::CACHE_TAG),
));

Según el significado de los parámetros que hemos comentado antes, el parámetro cache_lifetime nos indica que el bloque de novedades se guardará en caché por un máximo de 24 horas (86400 segundos). Pasado ese tiempo, Magento descartará la información y regenerará el bloque.

Además vemos que en cache_tags se ha configurado un array cuyo único componente es Mage_Catalog_Model_Product::CACHE_TAG.

Esta configuración indica a Magento que debe descartar la copia almacenada en caché siempre que se guarde un producto en nuestra tienda. De esa forma nos aseguramos que siempre que modifiquemos un producto, el bloque se regenere y se actualice con la nueva información si hemos marcado algún producto como novedad o lo hemos eliminado de esa clasificación.

Existen cache_tags para otros propósitos, como guardado de categorías, realización de pedidos, cambios en el stock, etc. Haced la búsqueda CACHE_TAG en el código y podréis encontrarlos fácilmente. Al final del artículo incluimos algunos de los más útiles.

Un poco más abajo veréis también esta función:

public function getCacheKeyInfo()
{
    return array(
        'CATALOG_PRODUCT_NEW',
        Mage::app()->getStore()->getId(),
        Mage::getDesign()->getPackageName(),
        Mage::getDesign()->getTheme('template'),
        Mage::getSingleton('customer/session')->getCustomerGroupId(),
        'template' => $this->getTemplate(),
        $this->getProductsCount()
    );
}

Mediante esta función, el bloque proporciona a Magento el último de los parámetros que comentábamos anteriormente (cache_key) y que forma el identificador único del bloque en la caché.

En este caso el identificador (cache_key) del bloque es un array con informaciones como el identificador de la tienda, el tema actual o el grupo de clientes del usuario conectado.

Si cambia cualquiera de los datos indicados en el array, el cache_key cambiará y se almacenará una nueva copia del bloque en caché.

Esto permite que el bloque de novedades sea diferente en función de la tienda (si tenemos varias) y también en función del grupo de clientes o de la plantilla que se esté cargando. Para cada una de esas situaciones, se almacenará en cache una nueva copia del bloque.

Cache Tags útiles

A continuación os dejamos algunos cache_tags útiles para realizar el borrado de los bloques de caché:

// Actualizar si se guarda cualquier producto
Mage_Catalog_Model_Product::CACHE_TAG
// Actualizar si se guarda el producto con ID = 1
Mage_Catalog_Model_Product::CACHE_TAG . '_1'
// Actualizar si se guarda cualquier categoría
Mage_Catalog_Model_Category::CACHE_TAG
// Actualizar si se guarda la categoría con ID = 1
Mage_Catalog_Model_Category::CACHE_TAG . '_1'
// De forma similar se pueden utilizar otros como:
Mage_Customer_Model_Customer::CACHE_TAG
Mage_Sales_Model_Config_Ordered::CACHE_TAG

Resumen

Mediante las ideas anteriores, podemos optimizar muchas de las páginas y bloques de nuestra tienda, de forma que los tiempos de carga de las páginas se reduzcan al máximo y podamos sacar todo el partido posible a los recursos de nuestro servidor.




Hey! Qué opinas sobre el artículo?