Próbki Enterprise 1.14.1 powodujące 35 sekund plus czas ładowania na stronach kategorii

23

W naszej najnowszej kompilacji witryny wdrożyliśmy nową wbudowaną funkcję Próbki. Po włączeniu próbek na stronach kategorii czas ładowania strony wynosi od 2 sekund do 38 + sekund.

Zastanawiałem się, czy ktokolwiek miał ten problem i czy mógłby dać nam wskazanie możliwych rozwiązań?

Wypróbowaliśmy EE 1.14.1 i CE 1.9.1 z 36 konfigurowalnymi produktami z próbkami zastosowanymi na standardowym motywie rwd i żadnych innych modułów aktywnych.

Ten problem nie może zostać rozwiązany przez buforowanie, ponieważ za każdym razem, gdy użytkownik wyszukuje lub filtruje kategorię, strona ponownie się zatrzymuje.

Dave Bevington
źródło
Nie mogę tego odtworzyć. Podaj nam więcej wskazówek na temat rodzaju zainstalowanych wtyczek, motywu itp. Postępuj zgodnie z procesem debugowania Magento, wyłączając motyw, wyłączając lokalne moduły i ponów próbę.
philwinkle,
Atrybuty, których używamy, to próbki kolorów i rozmiary nie więcej niż 8 na sztukę, aw większości przypadków nie więcej niż 4. To jest uruchamiane na pustej instalacji magento CE 1.9.1 z załadowanymi przykładowymi danymi i 10 konfigurowalnych produktów z niestandardowymi próbkami dodany. Jest to zdecydowanie związane z próbkami, ponieważ im więcej dodajemy, tym wolniej robi się strona. Pamiętaj, że buforowanie jest wyłączone, aby to sprawdzić, ponieważ użytkownicy mogą filtrować wyszukiwanie, a my nie możemy mieć szalonego czasu ładowania za każdym razem, gdy użytkownik poprawi swoje wyszukiwanie. Dzięki za
poświęcony

Odpowiedzi:

22

Dobrze. Wykryłem problem w funkcji Mage_ConfigurableSwatches_Helper_Mediafallback :: attachConfigurableProductChildrenAttributeMapping.

Wprowadzam w tym kilka zmian. Zwiększa to wydajność.

Próbować:

  1. Skopiuj /app/code/core/Mage/ConfigurableSwatches/Helper/Mediafallback.phpdo /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.php.

  2. Po przesłaniu /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.phppliku przenieś ten kod (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);
    

    przed foreachpętlą.

To jest zmieniona metoda:

 /**
 * 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.
źródło
Miałem ten sam problem z włączonymi próbkami na stronach listy, co znacznie przyspieszyło sprawę, więc dziękuję!
Marlon Creative
Znalazłem ten sam problem. rozwiązanie tego problemu zajęło ładowanie strony od 2,5 minuty do 7 sekund.
Andrew Kett,
Te próbki naprawdę spowalniają kategorie, zwłaszcza gdy masz wiele produktów, które można skoniugować. Rozwiązanie Андрей М. zredukuj obciążenie z 10 do 3 sekund w kategorii pełnej dzięki konfigurowalnym produktom! Dziękuję Ci!
user1895954,
+1! Dzięki za udostępnienie tego. Używamy wielu konfigurowalnych z kilkoma opcjami i po prostu nie mogliśmy już używać próbników kolorów ...
Marc
+1! Absolutnie genialna odpowiedź, czas ładowania zmieniony z 28 sekund na 3 sekundy! Dziękuję Ci!!
KI
4

Dodatkowy sposób na poprawienie konfigurowalnych próbek wydajności, gdy masz wiele opcji atrybutów.

Na przykład, jeśli masz 2000 opcji i wyświetlasz 36 produktów na liście katalogów, w tym przypadku metoda Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Attribute_Super_Collection::_loadOptionLabels()przyłączy się do każdej etykiety opcji super_atrybutów i otrzymasz 2000 * 36 = 72000 wierszy.

Przepisałem tę metodę i ładuje tylko 2000 wierszy zamiast 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;
}
Jarosław Woronoj
źródło