一个时间脚本来设置〜1M客户的自定义属性 - 内存泄漏
-
28-09-2020 - |
题
我正在尝试运行一次性脚本(在自定义模块升级中),以基于该客户的最后订单的日期,设置新的属性 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');
.
这样,您只会保存一个属性而不是保存客户模型的每个属性。