Optimizando Prestashop para productos con muchas combinaciones

Optimizando Prestashop para productos con muchas combinaciones

En este artículo vamos a hablar de como optimizamos la velocidad de carga de un producto en PrestaShop que tiene muchas combinaciones posibles. Hablamos de la tienda online de nuestro cliente UniqBrow.

Los productos en los que el cliente puede escoger color, talla, partes opcionales, etc… generan internamente en el PrestaShop un número elevado de posibles combinaciones que pueden hacer que la página del producto en cuestión cargue muy lentamente.

En el caso de UniqBrow, en esta página el cliente puede comprar unas gafas.

Screen Shot 2016-06-16 at 16.27.04

Pero antes de comprarlas, el cliente puede escoger el color de la parte frontal, si las quiere con cristales o sin cristales, también puede escoger el color del cristal, el color de la patilla y el del tip.

Screen Shot 2016-06-16 at 16.37.55

Si nos paramos a pensar un momento, podemos acabar comprando muchísimas combinaciones diferentes del mismo modelo de gafas en función de los colores y opciones que escojamos en el momento antes de realizar la compra. En concreto en este caso, el número de combinaciones posibles en estas gafas es de 8800!

Las opciones que el cliente puede escoger son:

  • Color frontal: 10 colores
  • Cristales: 2 opciones
  • Color cristal: 8 colores
  • Color tip: 11 colores
  • Color patilla: 5 colores

Para calcular el número de combinaciones solo hay que multiplicar 10 x 2 x 8 x 11 x 5 que es igual a 8800 combinaciones. Es verdad que si escogemos las gafas sin cristales entonces no hay posibilidad escoger su color y las combinaciones reales son algunas menos. No obstante, el PrestaShop no entiende el significado de las diferentes opciones y en su base de datos las cruza todas con todas. Por lo tanto, el PrestaShop va a tener 8800 combinaciones guardadas en su base de datos para este modelo de gafas.

Hasta aquí todo más o menos bien pero ahora viene un problema.

Cada una de estas combinaciones puede tener un precio diferente. En nuestro ejemplo, el escoger las gafas con cristales o sin ellos nos varia el precio final. Las gafas con cristales cuestan 59€ y sin cristales cuestan 29€. En nuestro ejemplo no hay más variaciones de precio pero podría darse el caso que algún color de frontal o de cualquier otra parte de las gafas fuese más caro o más barato por alguna razón.

Aquí es donde nuestro PrestaShop puede a empezar cargar la página del producto en cuestión muy lentamente. En nuestro ejemplo sin optimizar, el PrestaShop tarda unos 30 segundos en cargar la página del producto!

Screen Shot 2016-06-16 at 17.14.18

El navegador no termina de cargar nunca y irremediablemente el usuario cerrará la pestaña del navegador y se irá a otra tienda a comprarse otras gafas. Cliente perdido.

Llegados a este punto, utilizamos la herramienta XDebug para inspeccionar el funcionamiento interno del PrestaShop. Xdebug es una herramienta para inspeccionar código PHP que da información muy valiosa sobre el rendimiento de nuestra web.

Usando XDebug intentamos entender porque el PrestaShop tarda tanto en cargar la página del modelo de gafas.

El secreto está en que el PrestaShop, en el momento de cargar la página del producto, calcula el precio para cada combinación posible. Es decir, en nuestro caso, calcula 8800 precios! El PrestaShop no sabe que todas las gafas con patilla roja tienen el mismo precio, ni tampoco sabe que todas las gafas sea el que sea el color frontal valen lo mismo. Sencillamente va calculando ineficientemente todas las combinaciones posibles obteniendo siempre el mismo precio una y otra vez. Tan solo en el caso de la opción de los cristales debería de calcular el precio ya que es la única opción que realmente hace variarlo.

Esto lo descubrimos gracias al XDebug, en el siguiente gráfico

Model blues qcachegrind image

Este gráfico muestra los puntos del código que PrestaShop ejecuta cuando tiene que mostrar la página del producto. Aquí podemos ver que

  • A. ProductCore:getPriceStatic tarda el 27.93% del tiempo de carga de la página del producto
  • B. ToolsCore::convertPriceFull tarda el 54.39% del tiempo de carga de la página del producto

¿Y que hace este código? Pues el primero calcula el precio de todas las combinaciones del modelo de gafas y el segundo convierte el precio a la divisa seleccionada! 8800 veces!

Detectado el problema fue fácil implementar un pequeño código que enseña a PrestaShop a recordar que unas gafas amarillas valen lo mismo que unas rojas y que unas verdes y que unas con el tip azul, etc… Una vez implementado el código el tiempo de carga se redujo notablemente.

 

 

 

 

Artículos relacionados
2 Comentarios
  • Muchísimas gracias, ha sido de gran ayuda, aunque he de reconocer que hecho en falta la solución final. No sé como lo habréis resuelto. Si alguien busca alguna solución una idea es filtrar en el controlador ProductController.php en la función assignAttributes. Lo dicho muchas gracias y no os quedéis a medias.

  • Saludos. Como utilizaron xdebug, donde colocaron el codigo en el tpl del producto?

Deja tu comentario

Tu comentario*

Tu nombre*
Tu sitio web