Muestras Enterprise 1.14.1 que causan 35 segundos más tiempo de carga en páginas de categoría

23

Hemos implementado la nueva función de Muestras incorporada en nuestra última versión nueva del sitio. Cuando habilitamos las muestras en las páginas de categoría, el tiempo de carga de la página va de 2 segundos a 38 + segundos.

Me preguntaba si alguien más había tenido este problema y, de ser así, ¿podría darnos una indicación de las posibles soluciones?

Hemos probado EE 1.14.1 y CE 1.9.1 con 36 productos configurables con muestras aplicadas en el tema estándar rwd y ningún otro módulo activo.

Este problema no se puede resolver mediante el almacenamiento en caché, ya que cada vez que un usuario busca o filtra una categoría, la página se detiene nuevamente.

Dave Bevington
fuente
No puedo reproducir esto. Danos más información sobre el tipo de complementos instalados, el tema, etc. Sigue el proceso de depuración de Magento desactivando tu tema, desactivando los módulos locales y vuelve a intentarlo.
philwinkle
Los atributos que estamos utilizando son muestras de color y tamaños de no más de 8 por artículo y, en la mayoría de los casos, no más de 4. Esto se ejecuta en una instalación en blanco de Magento CE 1.9.1 con datos de muestra cargados y 10 productos configurables con muestras personalizadas adicional. Definitivamente está asociado con las muestras, ya que cuanto más agregamos, más lento se vuelve el sitio. Tenga en cuenta que el almacenamiento en caché se desactiva para probar esto, ya que los usuarios pueden filtrar la búsqueda y no podemos tener un tiempo de carga loco cada vez que un usuario modifica su búsqueda. Gracias por su tiempo :)
Dave Bevington

Respuestas:

22

Correcto. Detecto un problema en la función Mage_ConfigurableSwatches_Helper_Mediafallback :: attachConfigurableProductChildrenAttributeMapping.

Hago algunos cambios al respecto. Esto aumenta el rendimiento.

Tratar:

  1. Copiar /app/code/core/Mage/ConfigurableSwatches/Helper/Mediafallback.phpa /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.php.

  2. En el /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.phparchivo, mueva este código (ll.88-91)

     // normalize to all lower case before we start using them
     $optionLabels = array_map(function ($value) {
      return array_map('Mage_ConfigurableSwatches_Helper_Data::normalizeKey', $value);
     }, $optionLabels);
    

    hasta antes del foreachbucle.

Este es el método cambiado:

 /**
 * Set child_attribute_label_mapping on products with attribute label -> product mapping
 * Depends on following product data:
 * - product must have children products attached
 *
 * @param array $parentProducts
 * @param $storeId
 * @return void
 */
public function attachConfigurableProductChildrenAttributeMapping(array $parentProducts, $storeId)
{
    $listSwatchAttr = Mage::helper('configurableswatches/productlist')->getSwatchAttribute();

    $parentProductIds = array();
    /* @var $parentProduct Mage_Catalog_Model_Product */
    foreach ($parentProducts as $parentProduct) {
        $parentProductIds[] = $parentProduct->getId();
    }

    $configAttributes = Mage::getResourceModel('configurableswatches/catalog_product_attribute_super_collection')
        ->addParentProductsFilter($parentProductIds)
        ->attachEavAttributes()
        ->setStoreId($storeId)
    ;

    $optionLabels = array();
    foreach ($configAttributes as $attribute) {
        $optionLabels += $attribute->getOptionLabels();
    }

    // normalize to all lower case before we start using them
    $optionLabels = array_map(function ($value) {
        return array_map('Mage_ConfigurableSwatches_Helper_Data::normalizeKey', $value);
    }, $optionLabels);

    foreach ($parentProducts as $parentProduct) {
        $mapping = array();
        $listSwatchValues = array();

        /* @var $attribute Mage_Catalog_Model_Product_Type_Configurable_Attribute */
        foreach ($configAttributes as $attribute) {
            /* @var $childProduct Mage_Catalog_Model_Product */
            if (!is_array($parentProduct->getChildrenProducts())) {
                continue;
            }

            foreach ($parentProduct->getChildrenProducts() as $childProduct) {

                // product has no value for attribute, we can't process it
                if (!$childProduct->hasData($attribute->getAttributeCode())) {
                    continue;
                }
                $optionId = $childProduct->getData($attribute->getAttributeCode());

                // if we don't have a default label, skip it
                if (!isset($optionLabels[$optionId][0])) {
                    continue;
                }

                // using default value as key unless store-specific label is present
                $optionLabel = $optionLabels[$optionId][0];
                if (isset($optionLabels[$optionId][$storeId])) {
                    $optionLabel = $optionLabels[$optionId][$storeId];
                }

                // initialize arrays if not present
                if (!isset($mapping[$optionLabel])) {
                    $mapping[$optionLabel] = array(
                        'product_ids' => array(),
                    );
                }
                $mapping[$optionLabel]['product_ids'][] = $childProduct->getId();
                $mapping[$optionLabel]['label'] = $optionLabel;
                $mapping[$optionLabel]['default_label'] = $optionLabels[$optionId][0];
                $mapping[$optionLabel]['labels'] = $optionLabels[$optionId];

                if ($attribute->getAttributeId() == $listSwatchAttr->getAttributeId()
                    && !in_array($mapping[$optionLabel]['label'], $listSwatchValues)
                ) {
                    $listSwatchValues[$optionId] = $mapping[$optionLabel]['label'];
                }
            } // end looping child products
        } // end looping attributes


        foreach ($mapping as $key => $value) {
            $mapping[$key]['product_ids'] = array_unique($mapping[$key]['product_ids']);
        }

        $parentProduct->setChildAttributeLabelMapping($mapping)
            ->setListSwatchAttrValues($listSwatchValues);
    } // end looping parent products
}
Andrey M.
fuente
Estaba teniendo el mismo problema con las muestras habilitadas en las páginas de la lista y esto ayudó a acelerar las cosas considerablemente, ¡así que gracias!
Marlon Creative
Encontré el mismo problema. resolverlo tomó la carga de la página de 2.5 minutos a 7 segundos.
Andrew Kett
Estas muestras realmente ralentizan las categorías, especialmente cuando se tienen muchos productos que se pueden configurar. La solución de Андрей М. ¡Reduzca la carga de 10 a 3 segundos en una categoría completa con productos configurables! ¡Gracias!
user1895954
+1! Gracias por compartir esto. Estamos usando muchos configurables con varias opciones cada uno y ya no podíamos usar muestras de color ...
Marc
+1! ¡Respuesta absolutamente brillante, el tiempo de carga cambió de 28 segundos a 3 segundos! ¡¡Gracias!!
KI
4

Forma adicional de mejorar las muestras configurables de rendimiento cuando tiene muchas opciones de atributos.

Por ejemplo, si tiene 2000 opciones y muestra 36 productos en la lista del catálogo, en este caso el método Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Attribute_Super_Collection::_loadOptionLabels()se unirá a cada etiqueta de opción de super_attributes y obtendrá 2000 * 36 = 72000 filas.

He reescrito este método y carga solo 2000 filas en lugar de 72000

<?php
/**
 * Load attribute option labels for current store and default (fallback)
 *
 * @return $this
 */
protected function _loadOptionLabels()
{
    if ($this->count()) {
        $labels = $this->_getOptionLabels();
        foreach ($this->getItems() as $item) {
            $item->setOptionLabels($labels);
        }
    }
    return $this;
}

/**
 * Get Option Labels
 *
 * @return array
 */
protected function _getOptionLabels()
{
    $attributeIds = $this->_getAttributeIds();

    $select = $this->getConnection()->select();
    $select->from(array('options' => $this->getTable('eav/attribute_option')))
        ->join(
            array('labels' => $this->getTable('eav/attribute_option_value')),
            'labels.option_id = options.option_id',
            array(
                'label' => 'labels.value',
                'store_id' => 'labels.store_id',
            )
        )
        ->where('options.attribute_id IN (?)', $attributeIds)
        ->where(
            'labels.store_id IN (?)',
            array(Mage_Catalog_Model_Abstract::DEFAULT_STORE_ID, $this->getStoreId())
        );

    $resultSet = $this->getConnection()->query($select);
    $labels = array();
    while ($option = $resultSet->fetch()) {
        $labels[$option['option_id']][$option['store_id']] = $option['label'];
    }
    return $labels;
}

/**
 * Get Attribute IDs
 *
 * @return array
 */
protected function _getAttributeIds()
{
    $attributeIds = array();
    foreach ($this->getItems() as $item) {
        $attributeIds[] = $item->getAttributeId();
    }
    $attributeIds = array_unique($attributeIds);

    return $attributeIds;
}
Yaroslav Voronoy
fuente