我正在尝试运行一次性脚本(在自定义模块升级中),以基于该客户的最后订单的日期,设置新的属性 last_order_date

我有这个脚本:

$users = mage::getModel('customer/customer')->getCollection()
           ->addAttributeToSelect('last_order_date');

foreach ($users as $user){
   $lastDate = $user->getData('last_order_date');
   if(empty($lastDate)){
       $orderCollection = Mage::getModel('sales/order')->getCollection()
            ->addFilter('customer_id', $user->getId())
            ->setOrder('created_at', Varien_Data_Collection_Db::SORT_ORDER_DESC)
        ;
        $numberOfOrders = $orderCollection->count();
        if($numberOfOrders!=0){
            $newestOrder = $orderCollection->getFirstItem();
            $lastOrderDate = $newestOrder->getCreatedAt();
            $user->setData('last_order_date', $lastOrderDate);
            $user->save();
        }
   }
}
.

但它导致内存泄漏:

致命错误:允许的内存大小为1073741824字节耗尽(尝试过 分配32个字节) [..] / web root / lib / lib / zend / db / adapter / pdo / appristration.php 在线292

我理解的是由于循环呼叫对生成的呼叫。

如何在没有重复的呼叫的情况下实现这一点?

有帮助吗?

解决方案

require_once 'app/Mage.php';
Mage::app();

$current_page = isset($_GET['current_page']) ? 1 : $_GET['current_page'];

$users = mage::getModel('customer/customer')->getCollection()
           ->addAttributeToSelect('last_order_date')
           ->setPageSize(100)
           ->setCurPage($current_page);

if($users->count() == 0){
    die('done');
}

foreach ($users as $user){
   $lastDate = $user->getData('last_order_date');
   if(empty($lastDate)){
       $orderCollection = Mage::getModel('sales/order')->getCollection()
            ->addFilter('customer_id', $user->getId())
            ->setOrder('created_at', Varien_Data_Collection_Db::SORT_ORDER_DESC)
        ;
        $numberOfOrders = $orderCollection->count();
        if($numberOfOrders!=0){
            $newestOrder = $orderCollection->getFirstItem();
            $lastOrderDate = $newestOrder->getCreatedAt();
            $user->setData('last_order_date', $lastOrderDate);
            $user->save();
        }
   }
}

$current_page++;

//go to next page
$redirect_url = "http://yoururlhere/set_last_order_date.php?current_page=" . $current_page;
?>
<script type="text/javascript">
    setTimeout("location.href = '<?php echo $redirect_url;?>';", 50);
</script>

其他提示

添加到gurutheme答案巨大的性能服务器是使用saveAttribute而不是save

所以替换以下

$user->setData('last_order_date', $lastOrderDate);
        $user->save();
.

$user->setData('last_order_date', $lastOrderDate);
        $user->getResource()->saveAttribute($user,'last_order_date');
.

这样,您只会保存一个属性而不是保存客户模型的每个属性。

许可以下: CC-BY-SA归因
scroll top