我正在将数据(产品,客户和订单)从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++;
}
-
1 - 记忆:28147376
-
2 - 记忆:34600320
-
3 - 记忆:34661976
-
4 - 记忆:34721128
-
5 - 记忆:34776600
-
......
-
10 - 内存:35051216
-
......
-
100 - 记忆:40148904
在某些情况下,我需要导入数千种产品,这会导致内存溢出 . 正如您在上面的脚本中所看到的,我还尝试在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中内存使用的增加?
2 回答
试试
Mage::getSingleton('catalog/product');
而不是Mage::getModel('catalog/product');
您可以使用Mage :: getSingleton()方法,它会将内存问题减少50%,并尝试以块的形式执行数据 .