Enterprise 1.14.1 범주 페이지에서 35 초 및로드 시간을 발생시키는 견본


23

최신 새 사이트 빌드에서 새로운 내장 견본 기능을 구현했습니다. 카테고리 페이지에서 견본을 활성화하면 페이지로드 시간이 2 초에서 38+ 초로 늘어납니다.

다른 사람 이이 문제를 겪었는지 궁금하다면 가능한 해결책을 제시 할 수 있습니까?

wd 1.14.1 및 CE 1.9.1을 36 개의 구성 가능한 제품으로 표준 rwd 테마에 적용하고 다른 모듈은 활성화하지 않은 견본을 사용해 보았습니다.

이 문제는 사용자가 페이지를 다시 정지하기 위해 카테고리를 검색하거나 필터링 할 때마다 캐싱하여 해결할 수 없습니다.


이것을 재현 할 수 없습니다. 설치된 플러그인 유형, 테마 등에 대해 좀 더 지시 해주십시오. 테마를 비활성화하고 로컬 모듈을 비활성화하고 다시 시도 하여 Magento 디버깅 프로세스 를 따르십시오 .
philwinkle

우리가 사용하는 속성은 항목 당 8 개 이하, 대부분의 경우 4 개 이하의 색상 견본 및 크기입니다. 이는 샘플 데이터가로드 된 빈 magento CE 1.9.1 설치 및 맞춤형 견본이있는 10 개의 구성 가능한 제품에서 실행됩니다. 추가되었습니다. 사이트가 더 느려질수록 스와치와 분명히 관련됩니다. 사용자가 검색을 필터링 할 수 있고 사용자가 검색을 조정할 때마다 미친로드 시간을 가질 수 없으므로이를 테스트하기 위해 캐싱이 해제됩니다. 시간 내 주셔서 감사합니다 :)
Dave Bevington

답변:


22

권리. Mage_ConfigurableSwatches_Helper_Mediafallback :: attachConfigurableProductChildrenAttributeMapping 함수에서 문제를 감지했습니다.

나는 그것에 약간의 변경을합니다. 성능이 향상됩니다.

시험:

  1. 에 복사 /app/code/core/Mage/ConfigurableSwatches/Helper/Mediafallback.php하십시오 /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.php.

  2. /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.php파일 이동 이 코드를 (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);

    foreach루프 전까지 .

이것은 변경된 방법입니다.

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

목록 페이지에서 견본을 사용하도록 설정했을 때와 동일한 문제가 발생하여 작업 속도가 상당히 빨라졌습니다.
Marlon Creative

나는 같은 문제를 발견했다. 이를 해결하는 데 페이지로드가 2.5 분에서 7 초로 걸렸습니다.
Andrew Kett

이 견본은 특히 컨 피규어 블 제품이 많을 때 카테고리를 느리게합니다. Андрей М의 해결책. 구성 가능한 제품으로 가득 찬 카테고리에서 로딩을 10 초에서 3 초로 줄이십시오! 고맙습니다!
user1895954

+1! 이것을 공유해 주셔서 감사합니다. 우리는 각각 여러 옵션으로 구성 가능한 많은 것을 사용하고 더 이상 색상 견본을 사용할 수 없습니다 ...
Marc

+1! 절대적으로 훌륭한 답변, 로딩 시간이 28 초에서 3 초로 변경되었습니다! 고맙습니다!!
KI

4

많은 속성 옵션이있을 때 성능 구성 가능한 견본을 향상시키는 추가 방법.

예를 들어, 2000 개의 옵션이 있고 카탈로그 목록에 36 개의 제품을 표시하는 경우이 경우 메소드 Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Attribute_Super_Collection::_loadOptionLabels()는 각 super_attributes 옵션 레이블에 결합하여 2000 * 36 = 72000 개의 행을 얻습니다.

이 방법을 다시 작성했으며 72000 대신 2000 행만로드합니다.

<?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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.