Mejorar el rendimiento en Magento, cuellos de botella

Explicamos las claves para optimizar Magento mediante el uso de Zend cache

Profile picture for user admin
Por Way2 Ecommerce
10 Mar 2015

En ocasiones llegan a nosotros nuevos clientes que tienen problemas de rendimiento en Magento, debido a alguna nueva extensión que han instalado, o a una enorme cantidad de productos y categorías.

Medición de tiempos de rendimiento

Cuando hay un problema de rendimiento y está descartado el hardware, errores del lado del cliente, caché de Magento, o cualquiera de los sistemas aceleradores o de caché tipo APC, Xcache, Varnish, etc, lo que toca es mirar de qué forma se ejecutan los procesos. Hay que medir el tiempo de ejecución de cada proceso y ver si hay alguno que tarde bastante más que el resto. Hay sistemas para medir los tiempos de ejecución de Magento en la carga de una página que veremos en otros posts. Cuando detectamos en nuestro Magento un proceso que es muy lento puede ser debido a algún tipo de error que podremos investigar y solucionar, pero a veces el problema es alguna querie MySQL lenta que no se ha realizado correctamente en alguna de las extensiones instaladas, o incluso estando todo correcto también podemos tener este problema cuando nuestro Magento tiene una cantidad enorme de categorías con el atributo "is_anchor" a true, y una enorme cantidad de productos y filtros de atributos. Una vez detectado el problema de rendimiento tenemos la oportunidad de buscar una solución para esa querie lenta. En Magento, en ocasiones, algunas extensiones vienen encriptadas para que no se pueda modificar o copiar el código, en esta ocasión e incluso aunque el código esté abierto, otra buena solución es aprovechar la librería Zend_Cache que ya tenemos cargada para cachear la parte lenta de la web. Con Zend_Cache podemos cachear html o datos, por ejemplo, podemos cachear la respuesta de esa querie lenta para que no la haga cada vez. Esto optimizará el rendimiento de Magento, porque se ahorra el tiempo de respuesta de la query. Para cachear con Zend_Cache lo que necesitamos primero es definir una clave de caché. Una clave de caché tiene que ser única. Tenemos que pensar en qué dato único, o qué combinación única de datos necesitamos para obtener ese código o esos datos concretos. Por ejemplo:

  • Si cacheamos el menú de categorías y tenemos claro que no varía en ningúna página de nuestro Magento podemos utilizar una clave fija (p.ej: "micache_menu").
  • Pero si nuesto menú va a variar dependiendo de en qué categoría nos encontremos con un class="active", utilizaremos una clave dinámica (p.ej: "micache_menu".$categoryId)

Vamos a ver cómo implementaríamos la caché del bloque "menu" con una clave fija:

$opcionesFrontend = array(
  'lifetime' => 3600, // el tiempo que pasará hasta que la caché caduque 
  'automatic_serialization' => true
);
$opcionesBackend = array( 'cache_dir' => Mage::getBaseDir('cache')); // Para que guarde los archivos de caché en var/cache/*
 
$cache = Zend_Cache::factory('Core', 'File', $opcionesFrontend, $opcionesBackend);
$clave_cache = "micache_menu";
if($menucacheado = $cache->load($clave_cache)){
  echo $menucacheado;
} 
else {
  $menusincache = $this->getChildHtml('menu');
  echo $menusincache;
  $cache->save($menusincache); // Guardamos el html generado en caché con la clave "micache_menu"
}

 Suponiendo que la llamada a $this->getChildHtml('menu'); es muy lenta, esta sería una forma sencilla de mejorar el rendimiento de nuestro Magento.

Profile picture for user admin
Way2 Ecommerce

Expertos en Magento ecommerce. Definimos, desarrollamos, mantenemos y potenciamos tiendas online de la más alta calidad para que tu ecommerce supere todas tus expectativas.