0

我不确定为什么这个循环不起作用。

    $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->getAllItems() 失败

这些订单要么待处理,要么正在处理,要么已完成。

有什么我应该用 $order->getAllItems() 检查的东西,因为那是它失败了。

谢谢。

4

2 回答 2

2

乔恩,我认为您正在谈论的问题是您的脚本意外结束。即,你看到一个输出>

> O: 100021821

但不是 double 的输出>>

因为 Magento 是如此可定制的,所以不可能用给定的信息准确地诊断您的问题。您的系统中发生了某些事情(PHP 错误、未捕获的异常等),导致您的脚本停止。打开开发者模式并将 PHP ini 设置display_errors为 1 ( ini_set('display_errors', 1);) 并检查您的错误日志。如果您(或我们)遇到 PHP 错误,帮助您会容易得多。

我的猜测是你遇到了内存问题。PHP 实现对象的方式可能会导致少量内存泄漏——对象不会正确地自行清理。这意味着每次执行循环时,您都会慢慢消耗 PHP 请求所允许的内存总量。对于具有大量订单的系统,如果上述代码能够在内存不足之前完成所有操作,我会感到惊讶。

如果您的问题是内存问题,此 PDF 中有关于在 PHP 对象后手动清理的信息。您还应该考虑将您的操作拆分为多个请求。即第一个请求处理订单 1 - 100,接下来的 101 - 200 等。

于 2012-11-07T20:29:45.567 回答
1

你是什​​么意思它失败了?从输出的外观来看,它不会在那里失败,因为它会在调用 getAllItems() 的任一侧输出文本

改变:

$items = $order->getAllItems();

到:

foreach($order->getAllItems() as $orderItem) {
    echo $orderItem->getId() . "<br />";
}

看看会发生什么。

如果您在服务器上设置了较低的内存限制并且脚本在资源耗尽时退出,则该脚本每次可能以不同的订单 ID 结束。

于 2012-11-07T19:58:58.367 回答