我正在编写一个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()}");
...
}
希望能有所帮助。
所以如果你,你的脚本会更酷
- 从作为数组的所有产品中获取所有目录id
- 使用具有所需类别名称的IN()子句加载类别集合
- 再次预览您的产品系列,并从预装的带有正确元素的系列中选择必要的类别id
- 利润$$$$因为你没有使用内存,就像它对你来说是无限的
更酷的是将类别名称直接加入到产品集合中,这将消耗更少的资源