:::: MENU ::::

Optimizar Magento

3.67 avg. rating (72% score) - 9 votes

Este post está en continua evolución ya que vamos incorporando nuevas técnicas para optimizar tu tienda online cada cierto tiempo. Pretende ser una lista exhaustiva de las optimizaciones que podemos aplicar a nuestra tienda Magento, desde las más básicas que pueden activarse desde el administrador de la tienda, hasta las más complejas como los sistemas de Full Page Cache como Varnish.

Explicamos no solo la forma de activarlas sino también el por qué y el cómo funciona cada una de las optimizaciones, de forma que si eres desarrollador puedas implementarlas en tu propio Magento o tener una base para realizar pruebas e investigaciones posteriores.

Acciones desde el administrador de Magento

Puede sonar básico si ya llevas un tiempo desarrollando con Magento, pero es bastante frecuente encontrarse instalaciones de Magento que llegan a nuestra oficina y tienen la caché o el merge de archivos css y js desactivados. Incluso nos hemos encontrado situaciones en la que todas las optimizaciones básicas de Magento estaban deshabilitadas, pero se había instalado Varnish en el servidor, en un intento desesperado de acelerar la tienda.

Por ello, la primera sección del tutorial, va dedicada al administrador y las optimizaciones que podemos activar desde el mismo.

Activa la cache de Magento

Dificultad fácil. Mejora de rendimiento alta.

La diferencia en velocidad entre activar o no la caché, puede resultar en la reduccion del tiempo de carga a la mitad.

Para activar la cache de Magento, solo es necesario acceder a Sistema => Gestión de la Caché, seleccionar todas las opciones disponibles y Activarlas.

Puedes obtener más información detallada en este artículo sobre la Caché de Magento

Combinar archivos js y css en Magento

Dificultad fácil. Mejora de rendimiento alto.

Otra de las optimizaciones básicas es ha unión de archivos js y css. En una instalación estándar de Magento puede haber fácilmente 30 o 40 archivos de este tipo, y eso significa que cada vez que se carga una página, el navegador web necesita realizar 30 o 40 peticiones adicionales para descargar esos archivos.

Magento permite combinar todos los archivos js y css en uno solo, y eso reduce el número de peticiones al servidor, lo que hace que su carga disminuya en la misma proporción. Reducir el número de peticiones es una de las mejores optimizaciones que puedes realizar. Si sigues leyendo, verás que varios de los puntos hacen referencia a este mismo tipo de optimización.

La unión de los archivos js y css puede realizarse accediendo en el administrador a:
Sistema > Configuración > Desarrollador > Javascript Settings y CSS Settings

Puedes encontrar más información sobre esta y otras técnicas de reducción del número de peticiones en el artículo Optimizar Magento: Reducir el número de peticiones

Activar flat catalog

Dificultad fácil. Impacto en el rendimiento bajo.

En las primeras versiones de Magento existían muchos problemas de rendimiento y se requerían servidores mucho más potentes que con otros sistemas de tienda online existentes.

Esa fama de ‘lentitud’ ha llegado hasta hoy a pesar de que se han dado muchos pasos en la buena dirección y las diferencias con otras plataformas, ya no son tan grandes como antes.

Una de las características que más «daño» hace al rendimiento dentro de una tienda Magento es el uso del modelo EAV en la base de datos. Este sistema distribuye los datos de cada entidad en numerosas tablas, lo que complica las consultas SQL y hace disminuir el rendimiento. Si quieres saber más sobre el modelo EAV, puedes consultar el post Magento y el modelo de datos EAV.

Para paliar en cierto modo esta «desventaja» respecto a otros sistemas, Magento permite en Productos y Categorías, disponer de un sistema de catálogo Flat (un modelo tradicional en el que todos los datos de un producto o categoría se encuentran recogidos en una única tabla).

Compilar el código

Dificultad fácil. Impacto en el rendimiento bajo.

Otra optimización interesante es la activación del modo compilado de Magento. Esta optimización no mejora de forma sensible el comportamiento, pero cuando se trata de afinar y ganar décimas de segundo comienza a ser complicado, es otra optimización a añadir a la lista.

Cuando el código de Magento necesita instanciar un objeto, el interprete de PHP necesita buscar el archivo de definición de la clase. En Magento los archivos de código están distribuidos en múltiples carpetas y el archivo en cuestión puede encontrarse en diferentes lugares, lo que hace que Magento deba buscarlo hasta dar con él.

El proceso de compilación (que nada tiene que ver con la compilación del código fuente en algunos lenguajes de programación) consiste en recopilar todos los archivos y reunirlos en una única carpeta, lo que evita las repetitivas búsquedas en el disco e incrementa por tanto la velocidad.

El punto en contra de esta optimización es que necesitarás entre 100 y 200 MB adicionales de espacio en disco.

Mejoras en tu servidor Magento

Activar caché del navegador en .htaccess

Dificultad fácil. Impacto en el rendimiento medio.

De forma similar a lo que ocurre con la caché de Magento, los navegadores web también tienen su propio sistema de caché.

Esto les permite no descargar una y otra vez los mismos recursos cuando estamos navegando por una página web. De forma habitual hay muchos archivos en una web que no cambian (imágenes, archivos css y js, etc.).  Desde nuestro servidor podemos indicar a los navegadores esta circunstancia y eso reducirá el número de conexiones que realizan contra nuestro servidor para descargar archivos.

Para activar esta optimización de Magento es necesario que en tu servidor web tengas instalado alguno de estos dos módulos de apache: mod_expires o mod_headers.

El primero de ellos tiene el propósito específico de añadir esta cabecera de caché del navegador, mientras el segundo es un módulo más genérico que permite algunas cosas más.

Para ponerlo en marcha, asegúrate de tener instalada alguno de los módulos anteriores y también de que en el archivo .htaccess de la carpeta raíz de tu Magento tienes descomentadas las siguientes líneas:

<IfModule mod_expires.c>
    ExpiresDefault "access plus 1 year"
</IfModule>

En caso de no tener instalado mod_expires pero disponer de mod_headers, añade estas líneas:

<IfModule mod_headers.c>
  <FilesMatch "\.(css|js|jpe?g|png|gif)$">
    Header set Cache-Control "max-age=5259487, public"
  </FilesMatch>
</IfModule>

Puedes encontrar más información sobre esta y otras técnicas de reducción del número de peticiones en el artículo Optimizar Magento: Reducir el número de peticiones

Activar compresión en .htaccess

Dificultad fácil. Impacto en el rendimiento bajo.

De forma similar a los puntos anteriores, cuando un usuario se conecta a tu tienda Magento y descarga todos esos archivos de los que hablábamos en el punto anterior, podríamos mejorar el tiempo de carga de una página haciendo que la información viaje de forma comprimida desde el servidor hasta el navegador del usuario.

Para ello, nuevamente debemos tener instalado un nuevo módulo de apache en nuestro servidor. En este caso se trata del módulo mod_deflate.

En este caso, en una instalación normal de Magento, estas líneas vienen comentadas, por lo que deberás descomentarlas en tu fichero .htaccess.

<IfModule mod_deflate.c>

    # Insert filter on all content
    ###SetOutputFilter DEFLATE
    # Insert filter on selected content types only
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript

    # Netscape 4.x has some problems...
    BrowserMatch ^Mozilla/4 gzip-only-text/html

    # Netscape 4.06-4.08 have some more problems
    BrowserMatch ^Mozilla/4\.0[678] no-gzip

    # MSIE masquerades as Netscape, but it is fine
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

    # Don't compress images
    SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary

    # Make sure proxies don't deliver the wrong content
    Header append Vary User-Agent env=!dont-vary

</IfModule>

APC caché en tu servidor

Nivel medio/alto. Impacto en el rendimiento medio.

APC (Alternative PHP Caché) es como su nombre indica, un sistema de caché para PHP.

Se centra sobre todo en la caché de código, de forma que bloques de código que se ejecutan con frecuencia se guardan compilados en la memoria caché con el fin de que el acceso y ejecución de los mismos sea más rápida que en el caso habitual de acceso a disco.

En el flujo habitual de ejecución de un programa PHP es necesario interpretar y compilar el código antes de su ejecución, fases que se evitan teniendo el código previamente parseado y compilado.

APC es adecuando en configuraciones de Magento en un único servidor. Si tenemos más de un servidor en nuestra arquitectura de Magento, entonces es más recomendable utilizar otras alternativas, como Memcached.

Memcached también puede utilizarse en configuraciones de Magento con un único servidor, pero en estos casos preferimos APC por su sencillez de instalación y configuración.

Puedes encontrar información sobre la instalación y configuración de APC en el artículo: Caché con APC + TMPFS (DOS NIVELES)

Utiliza disco RAM (tmpfs) para cache en disco

Nivel medio/alto. Impacto en el rendimiento medio.

Una mejora al sistema de caché con APC o Memcached que planteamos en algunos sistemas, es incluir un segundo nivel de caché en RAM, de forma que el acceso a datos frecuentes se realiza en tres fases:

Memoria APC + Disco RAM (carpeta var/cache) + Archivos de configuración.

Hemos descrito la configuración de este sistema en el artículo Caché con APC + TMPFS (DOS NIVELES).

Sin embargo debes tener cuidado con la implementación de este sistema, ya que sólo es adecuado para algunos tipos de servidores, donde el acceso a disco es lento o está compartido con otros hostings. Si tu servidor es un dedicado, probablemente no notes diferencias o incluso consigas un rendimiento peor, por lo que no te recomendamos su implementación en estos casos.

Te recomendamos que si lo implementas, realices pruebas de carga.

Código de tu plantilla Magento

Combinar sprites de css

Dificultad media/alta. Impacto en el rendimiento medio.

Al igual que en alguna técnica anterior apuntábamos a reducir el número de archivos css y js mediante su combinación en uno o dos archivos, esta nueva técnica consiste en aplicar el mismo concepto a las imágenes auxiliares de tu tienda Magento (iconos, logos y otros elementos del diseño de la plantilla).

La técnica consiste en agrupar todos los iconos, logos y demás imágenes auxiliares de tu web en un único archivo de imagen y mostrar la imagen adecuada mediante el uso de las propiedades background-position de css.

Esto permite (nuevamente) reducir el número de peticiones al servidor ya que una vez descargada esa imagen, el navegador la guardará en su caché y no deberá volver a solicitarla al servidor en el futuro.

Puedes encontrar más información sobre esta y otras técnicas de reducción del número de peticiones en el artículo Optimizar Magento: Reducir el número de peticiones

Lazy load de imágenes

Nivel medio. Impacto en el rendimiento medio.

Esta técnica consiste en evitar la descarga de imágenes innecesarias, si estas imágenes no van a mostrarse.

Por ejemplo imagina que tienes una página de categoría con 100 productos. Inicialmente sólo serán visibles unas pocas de esas imágenes, pongamos que son 10.  Si el usuario no hace scroll hacia abajo, habremos cargado 90 imágenes adicionales que nunca se van a mostrar.

Para evitar esta descarga innecesaria, se pueden utilizar librerías de Lazy Load de imágenes, de forma que las imágenes que quedan ocultas no se de descargan si el usuario no realiza scroll hasta mostrarlas.

La utilización de esta técnica es necesaria principalmente en aquellas páginas donde se muestra un número elevado de imágenes, como puedan ser páginas de categorías, resultados de búsqueda, etc.

Optimizar Magento: Reducir el número de peticiones

Mejoras en la base de datos de Magento

Limpieza de base de datos

Dificultad fácil. Impacto en el rendimiento bajo.

Si llevas un tiempo con tu tienda Magento abierta al público y vas echando un vistazo a la base de datos, verás que poco a poco su tamaño va creciendo cada vez más, hasta ocupar cantidades ingentes de espacio (en ocasiones hemos visto bases de datos de varios gigas).

El tener una base de datos demasiado grande puede hacer que algunos procesos se ralenticen, con lo que deberías prestarle atención a este hecho.

En particular hay algunas cosas que puedes hacer, como programar la limpieza automática de logs en:

Sistema > Configuración => Sistema => Log Cleaning

También debes saber que algunas de las tablas almacenan información de visitas que normalmente no necesitarás y que por tanto puedes limpiar sin problema de vez en cuando. Son estas:

  • log_url
  • log_url_info
  • log_visitor
  • log_visitor_info
  • report_event
  • report_viewed_product_index
  • report_compared_product_index

 

Si has programado la limpieza de logs desde el panel de control, las cuatro primeras tablas se irán borrando de forma automática a la hora programada. En caso contrario puedes programar un script mediante cron para realizar esta tarea.

Usa un dominio cookie-less para imágenes y archivos js y css

Dificultad media. Impacto en el rendimiento bajo.

Seguramente no te descubriremos nada nuevo si te decimos que Magento usa cookies. Sí, es así aunque no te lo creas ;)

Las cookies quedan almacenadas en el ordenador del usuario, y para que Magento sea capaz de leerlas y actuar en consecuencia, es necesario que en cada petición, la cookie viaje desde el ordenador del usuario al servidor web. Cada vez y para cada petición, y eso por tanto incluye tanto la carga de una página como la descarga de imágenes o archivos css y js.

Pero en realidad, hay algunos casos en los que esta información no es necesaria en absolulto, por ejemplo a la hora de descargar imágenes.

En estos casos, el hecho de que las cookies viajen de un extremo al otro, solo suponen un aumento en la cantidad de datos y por tanto una ralentización en toda la comunicación.

Para evitarlo se suelen configurar dominios cookie-less (por ejemplo un subdominio del dominio que utilizas para tu tienda), y se configuran para el acceso a las carpetas media y skin de tu tienda.

Esto puede hacerse en Sistema => Configuración => General => Web y luego modificando las configuraciones de las secciones Seguro e Inseguro de acuerdo a la configuración de tu servidor.

En nuestros proyectos solemos configurar un dos subdominios del principal, de forma que:

  • A la carpeta media se accede desde images.midominio.com
  • A la carpeta skin se accede desde static.midominio.com

Esta configuración, además permite que los navegadores descarguen más información de forma simultánea ya que en la mayoría de los casos secuencian el acceso a un mismo dominio pero realizan accesos paralelos a diferentes dominios.

Acciones avanzadas para optimizar tu Magento

Usa la caché de bloques

Nivel medio. Impacto en el rendimiento medio.

En el caso de tener bloques dentro de tu página que consumen muchos recursos por la cantidad de datos que manejan, recuerda que Magento pone a disposición de los desarrolladores su potente sistema de caché.

Utilizando este sistema, si por ejemplo en tu página existe un bloque que muestra los productos más vendidos, puedes conseguir que ese bloque quede almacenado en caché y no sea necesario obtener de la base de datos los productos más vendidos en cada carga de página.

Esta técnica aplicada a todos los bloques donde se pueda aplicar puede suponer descensos muy fuertes en los tiempos de carga de las páginas.

En los bloques en los que quieras utilizar esta técnica, simplemente tienes que añadir una serie de datos en su constructor.

      // Configuración de la cache 
      $this->addData(array(
          'cache_lifetime'    => <tiempo de validez de los datos en segundos>,
          'cache_tags'        => array(Mage_Catalog_Model_Product::CACHE_TAG),
          'cache_key'         => $this->_cacheKey,
      ));

Puedes ver más información sobre esta técnica en el post Uso de la caché de bloques en Magento.

Caché de página (full page cache)

Nivel alto. Impacto en el rendimiento alto.

La instalación de Varnish Caché en el servidor servidor de tu tienda Magento, aunque no puede considerarse como una optimización propia de la tienda, es sin duda una de las acciones que más van a reducir los tiempos de carga de tu tienda online.

La instalación y configuración de Varnish Caché en Magento Community (Magento Enterprise tiene su propio sistema de caché) es un tema suficientemente complejo como para tratarlo por separado.

Puedes comenzar echando un vistazo al artículo Optimizar Magento con Varnish Caché




3 Comments

Hey! Qué opinas sobre el artículo?