1

我正在编写一个 magento 产品导出器,它将几个属性写入 csv 文件。一个属性称为“类别字符串”,其方法如下所示:

...
foreach($products as $_product) {       
        ...

        $productId      = $_product->getSku();
        $productCategory    = getCategoryString($_product['category_ids']);
        ...
}
...

function getCategoryString($numbers) {

    $catString = '';
    $catModel = Mage::getModel('catalog/category')->setStoreId(Mage_Core_Model_App::ADMIN_STORE_ID);

    $ex = explode(',', $numbers);

    foreach ($ex as $i =>  $e) {

        if ($i > 0) {

            $catString .= $catModel->load($e)->getName();

            if ($i < (count($ex)-1))
                $catString .= ' > ';
        }
    }

    $ex = NULL;
    $numbers = NULL;

    $catModel->unsetData();
            unset($catModel);
            $catModel = NULL;

    return $catString;
}

但在每次迭代之后,每个产品的方法调用成本约为 1MB,而我有大约 9000 个产品!我无法清理 $catModel 变量!$catModel = NULL 和 unset($catModel) 行没有效果。我究竟做错了什么?我怎样才能强制取消设置对象?!

4

2 回答 2

1

Magento 的 cron 也有同样的问题,我知道这不是最好的方法,但我们需要快速完成。

我们的解决方案是创建一个新的 PHP 文件,其中包含执行单个操作所需的代码。从 magento 我们得到一个产品列表,然后使用 exec() 按产品调用这个外部 PHP 文件。

像这样的东西:

foreach($products as $_product) {       
        ...

        exec("do_the_work.php {$_product->getSku()}");

        ...
}

希望能帮助到你。

于 2011-06-02T15:56:15.390 回答
0

所以你的脚本会更酷,如果你

  1. 从您拥有的所有产品中获取所有目录 ID 作为数组
  2. 使用您需要的类别名称使用 IN() 子句加载类别集合
  3. 再次 foreach 您的产品集合,并从预加载的集合中选择具有正确元素的 neccecary 类别 ID
  4. 利润 $$$$ 因为您没有使用内存,因为它对您来说是无限的

更酷的事情是将类别名称直接加入产品集合,这将消耗更少的资源

于 2011-06-02T16:46:52.090 回答