我不确定为什么这个循环不起作用。
$orders = Mage::getSingleton('sales/order')->getCollection()
->addAttributeToSelect('*')
->addFieldToFilter('created_at', array('from'=>$from, 'to'=>$to))
->addAttributeToSort('increment_id', 'ASC')
;
foreach ($orders as $item) {
$order_id = $item->increment_id;
if (is_numeric($order_id)) $order = Mage::getModel('sales/order')->loadByIncrementId($order_id);
if (is_object($order)) {
echo "> O: ". $order_id ."<BR>";
$items = $order->getAllItems();
echo ">> O: ". $order_id ."<BR>";
} else
die("DIE ". var_dump($order));
}
die("<BR> DONE");
输出:
...
...
>> O: 100021819
> O: 100021820
>> O: 100021820
> O: 100021821
循环永远不会完成,也不会停在相同的order_id。?
$ order-&gt; getAllItems()
总是失败这些订单待定,处理或完成。
我应该用$ order-&gt; getAllItems()检查一下,因为那是失败的。
感谢。
答案 0 :(得分:1)
>
的输出
> O: 100021821
但不是双>>
的输出。
由于Magento是如此可定制的,因此无法根据给出的信息准确诊断您的问题。您的系统中发生了某些事情(PHP错误,未捕获的异常等),导致脚本停止。打开开发人员模式并将PHP ini display_errors
设置为1(ini_set('display_errors', 1);
)并检查错误日志。一个你(或我们)有PHP错误,帮助你会更容易。
我的猜测是你遇到了内存问题。 PHP实现对象的方式可能导致小内存泄漏 - 对象无法正确清理。这意味着每次进行循环时,您都会慢慢消耗PHP请求允许的总内存量。对于拥有大量订单的系统,如果上述代码在内存不足之前可以通过所有内容,我会感到惊讶。
如果您的问题是内存问题,则有关于PHP对象in this PDF之后手动清理的信息。您还应该考虑将您的操作拆分为多个请求。即第一个请求处理订单1 - 100,下一个101 - 200,等等。
答案 1 :(得分:0)
你是什么意思失败了? 通过输出的外观,它不会在那里失败,因为它在调用getAllItems()的任一侧输出文本
变化:
$items = $order->getAllItems();
为:
foreach($order->getAllItems() as $orderItem) {
echo $orderItem->getId() . "<br />";
}
看看会发生什么。
如果您在服务器上设置了较低的内存限制,并且在资源不足时退出,则脚本每次都可能以不同的订单ID结束。