magento内存问题,无法取消设置对象


magento memory problem, cannot unset objects

我正在编写一个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)行没有任何效果。我做错了什么?如何强制取消设置对象?!

我们在Magento的cron上也遇到了同样的问题,我知道这不是最好的方法,但我们需要尽快完成。

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

类似这样的东西:

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

希望能有所帮助。

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

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

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