Показать специальные продукты с даты - Оптимизируйте 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>";
}