Показать специальные продукты с даты - Оптимизируйте Magento Script

Я пытаюсь перечислить все продукты, которые имеют особую дату, которая находится в течение последних 72 часов. Сценарий работает отлично, за исключением более 400 продуктов, время ожидания.

Я думаю, что загружаю слишком много коллекций или неправильно использую загруженные, поэтому мне просто нужен совет по оптимизации, пожалуйста.

Вот сценарий:

<?php


set_time_limit(0);
require_once 'app/Mage.php';
Mage::app('default');

try
{
    $products = Mage::getModel('catalog/product')->getCollection()
        ->setStoreId(1);
    $products->addAttributeToFilter('status', 1);
    $products->addAttributeToFilter('visibility', 4);
    $products->addAttributeToSelect('*');
    $prodIds=$products->getAllIds();
    $product_count = 0;
    $products_changed = 0;

    //$product = Mage::getModel('catalog/product');

    echo "Price Changes Last 72 Hours<br><br>";

    foreach($prodIds as $productId) 
    {
        $product_count++;
        //$products->load($productId);

        // load product data
        $product = Mage::getModel('catalog/product')->load($productId);

        $special_price = round($product->getSpecialprice(),2);
        $human_readable_date = $product->getSpecialFromDate();
        $sku = $product->getSku();
        $specialPriceFromDate = strtotime($human_readable_date);
        $time_now = microtime(true);
        $product_link = "http://www.mydomain.com.au/".$product->getUrlPath(); 
        $date_array = explode( ' ', $human_readable_date);
        $short_date = $date_array[0];

        if (($time_now - $specialPriceFromDate) < 259200)
        {
            $products_changed++; 
            echo "SKU: " . '<a href=' . $product_link . '>' . $sku . '</a>' . "  Date Changed: " . $short_date . " New Price $" . $special_price . "<br>";
        }
        //if ($product_count == 400) exit;  
    }
}

catch(Exception $e){
    $headers = 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 
    error_log($e->getMessage(), 1, 'me@mydomain.com.au', $headers);
    die($e->getMessage());
}


?>

1 ответ

Решение

Сначала вы загружаете полную коллекцию, а затем снова загружаете все продукты, один за другим. Это приведет к огромному потреблению памяти и будет медленным.

Кроме того, вы загружаете все атрибуты продукта (которые могут быть сотнями), но в основном вас интересуют только некоторые из них.

Чтобы оптимизировать обе проблемы, я бы рекомендовал напрямую фильтровать только те продукты, которые вас интересуют:

$iNow = strtotime(date('Y-m-d H:i:s'));
$iFrom = $iNow - (60 * 60 * 24 * 3);
$oProductCollecion = Mage::getModel('catalog/product')
    ->getCollection()
    ->setStoreId(1)
    ->addAttributeToSelect(array('sku', 'special_price', 'url_path'))
    ->addAttributeToFilter('status', 1)
    ->addAttributeToFilter('visibility', 4)
    ->addAttributeToFilter(
        'special_from_date',
         array('from' => date('Y-m-d H:i:s', $iFrom))
    );

foreach($oProductCollecion as $oProduct) {
    $product_link = "http://www.mydomain.com.au/" . $oProduct->getUrlPath();
    $sku = $oProduct->getSku();
    $short_date = $oProduct->getSpecialFromDate();
    $special_price = round($oProduct->getSpecialPrice(), 2);
    echo "SKU: " . '<a href=' . $product_link . '>' . $sku . '</a>' . "  Date Changed: " . $short_date . " New Price $" . $special_price . "<br>";
}
Другие вопросы по тегам