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 inidisplay_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 に答える