如何修复 Magento 中与 load() 方法相关的内存泄漏?

How to fix memory leaks in Magento related to load() method?

我正在将数据(产品、客户和订单)从一个 Magento 商店导入到另一个 Magento 商店。

例如,当我尝试导入产品时,我需要加载产品以检查它是否已经存在并使用加载产品的一些属性。 我正在使用方法 Mage::getModel('catalog/product')->load($sku) 并且我 运行 使用命令行的脚本。

类似于: $ php -f shell/mymodule.php

问题是当我在循环中使用 load() 方法时,Magento 不会停止增加内存使用量。

foreach ($result['items'] as $item) {
     echo $index . ' - Memory: ' . memory_get_usage() . "\n";

     /** @var Mage_Catalog_Model_Product $product */
     $product = Mage::getModel('catalog/product');
     $product->load($product->getIdBySku($item['sku']));

     $product->getOptionInstance()->unsetOptions()->clearInstance();
     unset($product);
     gc_collect_cycles();

     $index++;
}

在某些情况下,我需要导入数千个产品,这会导致内存溢出。正如您在上面的脚本中看到的,我还尝试 运行 foreach 中的一些优化函数,但这在性能上不足以防止内存溢出。

$product->getOptionInstance()->unsetOptions()->clearInstance();
unset($product);
gc_collect_cycles();

我找到了一种更改 Magento 核心的解决方案,但它是为 Magento 1.4 制作的,不适用于我正在使用的 Magento 1.9。

https://ringsdorff.net/2009/07/23/guest-post-fix-for-memory-leaks-in-magento/

Magento 1.9内存使用量增加有没有有效的解决方案?

尝试 Mage::getSingleton('catalog/product'); 而不是 Mage::getModel('catalog/product');

您可以使用 Mage::getSingleton() 方法,它将减少 50% 的内存问题,并尝试以块的形式执行数据。