Enterprise 1.14.1 Swatches gây ra 35 giây cộng với thời gian tải trên các trang chuyên mục


23

Chúng tôi đã triển khai tính năng Swatches sẵn có mới trong bản dựng trang web mới nhất của chúng tôi Khi chúng tôi kích hoạt các mẫu màu trên các trang danh mục, thời gian tải trang đi từ 2 giây đến 38 + giây.

Tôi đã tự hỏi nếu có ai khác có vấn đề này và nếu vậy có thể cho chúng tôi một dấu hiệu của bất kỳ giải pháp có thể?

Chúng tôi đã thử EE 1.14.1 và CE 1.9.1 với 36 sản phẩm có thể định cấu hình với các mẫu được áp dụng trên chủ đề rwd tiêu chuẩn và không có mô-đun nào khác hoạt động.

Vấn đề này không thể được giải quyết bằng cách lưu vào bộ đệm khi mỗi lần người dùng tìm kiếm hoặc lọc một danh mục, trang sẽ dừng lại một lần nữa.


Tôi không thể tái tạo điều này. Vui lòng cung cấp cho chúng tôi thêm một số hướng về loại plugin được cài đặt, chủ đề, v.v. Vui lòng làm theo quy trình gỡ lỗi Magento bằng cách vô hiệu hóa chủ đề của bạn, vô hiệu hóa các mô-đun cục bộ và thử lại.
philwinkle

Các thuộc tính chúng tôi đang sử dụng là các mẫu màu và kích thước không quá 8 cho mỗi mục và trong hầu hết các trường hợp không quá 4. Điều này đang được chạy trên bản cài đặt magento CE 1.9.1 trống với dữ liệu mẫu được tải và 10 sản phẩm có thể định cấu hình với các mẫu màu tùy chỉnh thêm. Nó chắc chắn được liên kết với các mẫu màu vì chúng ta càng thêm vào trang web càng chậm. Xin lưu ý rằng bộ nhớ đệm đã bị tắt để kiểm tra điều này vì người dùng có thể lọc tìm kiếm và chúng tôi không thể có thời gian tải điên cuồng mỗi khi người dùng điều chỉnh tìm kiếm của họ. Cảm ơn thời gian của bạn :)
Dave Bevington

Câu trả lời:


22

Đúng. Tôi phát hiện sự cố trên Mage_ConfigurableSwatches_Helper_Mediafallback :: AttachConfigurable ProducttChildrenAttributionMapping.

Tôi thực hiện một số thay đổi về nó. Điều này làm tăng hiệu suất.

Thử:

  1. Sao chép /app/code/core/Mage/ConfigurableSwatches/Helper/Mediafallback.phpvào /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.php.

  2. Trên /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.phptệp di chuyển mã này (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);

    lên đến trước foreachvòng lặp.

Đây là phương pháp đã thay đổi:

 /**
 * 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
}

Tôi đã gặp vấn đề tương tự với các mẫu màu được kích hoạt trên các trang danh sách và điều này giúp tăng tốc mọi thứ lên đáng kể, cảm ơn!
Marlon Creative

Tôi tìm thấy vấn đề tương tự. giải quyết nó mất thời gian tải trang từ 2,5 phút đến 7 giây.
Andrew Kett

Những mẫu màu này thực sự làm chậm các danh mục đặc biệt là khi bạn có nhiều sản phẩm khó hiểu. Các giải pháp của Мндрей М. cắt giảm tải từ 10 đến 3 giây trên một danh mục đầy đủ với các sản phẩm có thể định cấu hình! Cảm ơn bạn!
dùng1895954

+1! Cảm ơn đã chia sẻ điều này. Chúng tôi đang sử dụng rất nhiều cấu hình với một số tùy chọn mỗi tùy chọn và không thể sử dụng các mẫu màu nữa ...
Marc

+1! Câu trả lời hoàn toàn xuất sắc, thời gian tải thay đổi từ 28 giây thành 3 giây! Cảm ơn bạn!!
KI

4

Cách bổ sung để cải thiện các mẫu màu có thể định cấu hình khi bạn có nhiều tùy chọn thuộc tính.

Ví dụ: nếu bạn có 2000 tùy chọn và hiển thị 36 sản phẩm trong danh sách danh mục, trong trường hợp này, phương thức Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Attribute_Super_Collection::_loadOptionLabels()này sẽ tham gia vào mỗi nhãn tùy chọn super_attribution và bạn sẽ nhận được 2000 * 36 = 72000 hàng.

Tôi đã viết lại phương thức này và nó chỉ tải 2000 hàng thay vì 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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.