我正在尝试列出过去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());
}
?>发布于 2013-04-09 15:49:57
首先加载一个完整的集合,然后再逐个加载所有产品。这将导致巨大的内存消耗,并将是缓慢的。
此外,您正在加载所有产品属性(可以是数百个),但主要似乎只对其中的一小部分感兴趣。
为了优化这两个问题,我建议直接过滤感兴趣的产品:
$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>";
}https://stackoverflow.com/questions/15891115
复制相似问题