Collections 如何循环Magento集合?
基本上,我需要获取客户的CSV文件,每天以脚本自动生成。 我试过几种方法,但都太慢了,或者实际上已经没有记忆了 *1) foreach通过集合资源* 2) foreach和load客户Collections 如何循环Magento集合?,collections,csv,magento,export,Collections,Csv,Magento,Export,基本上,我需要获取客户的CSV文件,每天以脚本自动生成。 我试过几种方法,但都太慢了,或者实际上已经没有记忆了 *1) foreach通过集合资源* 2) foreach和load客户 $collection = Mage::getResourceModel('customer/customer_collection'); foreach($collection as $customer) { $fullcustomer = Mage::getModel("customer/customer
$collection = Mage::getResourceModel('customer/customer_collection');
foreach($collection as $customer) {
$fullcustomer = Mage::getModel("customer/customer")->load($customer->getId());
echo $fullcustomer->getFirstname() . ",";
}
有什么想法吗
谢谢 在每个客户对象上使用load()
会大大降低代码的速度。我建议您将所需属性添加到集合中的第一种方法是正确的,但请使用以下方法完成:
$collection->toArray([$arrRequiredFields = array()]);
这样,就不会加载单个客户,但是toArray()
()将为您提供所需的字段,然后您可以迭代多维数组以生成逗号分隔的字符串
或者,您可以尝试
$collection->toXml()
,如果您对此感到满意的话,可以使用XML。Google将为您指出xml->csv转换方法。尝试为大型集合分页
这样做的目的是,如果可以将集合装入更小的块中,那么就不会占用那么多内存。
加载一个区块(页面),然后对其执行一些操作,例如将其保存到文本文件,然后加载下一个区块。结果是,您使用了整个较大的集合,但只产生了最大页面的内存开销
我们使用类似的东西从我们的商店出口订单。
我插入了你的收藏,它似乎起作用了
<?php
if(php_sapi_name()!=="cli"){
echo "Must be run from the command line.";
};
/**
* Setup a magento instance so we can run this export from the command line.
*/
require_once('app/Mage.php');
umask(0);
if (!Mage::isInstalled()) {
echo "Application is not installed yet, please complete install wizard first.";
exit;
}
// Only for urls // Don't remove this
$_SERVER['SCRIPT_NAME'] = str_replace(basename(__FILE__), 'index.php', $_SERVER['SCRIPT_NAME']);
$_SERVER['SCRIPT_FILENAME'] = str_replace(basename(__FILE__), 'index.php', $_SERVER['SCRIPT_FILENAME']);
Mage::app('admin')->setUseSessionInUrl(false);
Mage::setIsDeveloperMode(true); ini_set('display_errors', 1); error_reporting(E_ALL);
try {
Mage::getConfig()->init();
Mage::app();
} catch (Exception $e) {
Mage::printException($e);
}
ini_set('memory_limit','500M');
$customerCount = 0;
try{
//configure the collection filters.
$collection = Mage::getResourceModel('customer/customer_collection')
->addAttributeToSelect('email')
->addAttributeToSelect('created_at')
->joinAttribute('billing_company', 'customer_address/company', 'default_billing', null, 'left')
->joinAttribute('billing_street', 'customer_address/street', 'default_billing', null, 'left')
->joinAttribute('billing_postcode', 'customer_address/postcode', 'default_billing', null, 'left')
->joinAttribute('billing_telephone', 'customer_address/telephone', 'default_billing', null, 'left')
->joinAttribute('billing_city', 'customer_address/city', 'default_billing', null, 'left')
->joinAttribute('billing_region', 'customer_address/region', 'default_billing', null, 'left')
->joinAttribute('billing_country_id', 'customer_address/country_id', 'default_billing', null, 'left');
//Add a page size to the result set.
$collection->setPageSize(100);
//discover how many page the result will be.
$pages = $collection->getLastPageNumber();
$currentPage = 1;
//This is the file to append the output to.
$fp = fopen('/tmp/customers.csv', 'w');
do{
//Tell the collection which page to load.
$collection->setCurPage($currentPage);
$collection->load();
foreach ($collection as $customer){
//write the collection array as a CSV.
$customerArray = $customer->toArray();
//var_dump($customerArray); echo "\n\n";
fputcsv($fp, $customerArray);
$customerCount++;
}
$currentPage++;
//make the collection unload the data in memory so it will pick up the next page when load() is called.
$collection->clear();
} while ($currentPage <= $pages);
fclose($fp);
} catch (Exception $e) {
//$response['error'] = $e->getMessage();
Mage::printException($e);
}
echo "Saved $customerCount customers to csv file \n";
?>
这两种解决方案似乎都可行,但似乎都不是特别理想的。你能用这两种方法更新你的帖子吗,这样我们就可以知道你在找什么了?试着在Magento中使用资源迭代器。请看这篇文章:分页集合绝对是一条正确的道路。它速度非常快,内存效率也更高。不过,我注意到在使用它时,每个页面的处理时间都比前一页长。这就好像collection->clear()并没有真正释放内存,或者发生了其他事情。
<?php
if(php_sapi_name()!=="cli"){
echo "Must be run from the command line.";
};
/**
* Setup a magento instance so we can run this export from the command line.
*/
require_once('app/Mage.php');
umask(0);
if (!Mage::isInstalled()) {
echo "Application is not installed yet, please complete install wizard first.";
exit;
}
// Only for urls // Don't remove this
$_SERVER['SCRIPT_NAME'] = str_replace(basename(__FILE__), 'index.php', $_SERVER['SCRIPT_NAME']);
$_SERVER['SCRIPT_FILENAME'] = str_replace(basename(__FILE__), 'index.php', $_SERVER['SCRIPT_FILENAME']);
Mage::app('admin')->setUseSessionInUrl(false);
Mage::setIsDeveloperMode(true); ini_set('display_errors', 1); error_reporting(E_ALL);
try {
Mage::getConfig()->init();
Mage::app();
} catch (Exception $e) {
Mage::printException($e);
}
ini_set('memory_limit','500M');
$customerCount = 0;
try{
//configure the collection filters.
$collection = Mage::getResourceModel('customer/customer_collection')
->addAttributeToSelect('email')
->addAttributeToSelect('created_at')
->joinAttribute('billing_company', 'customer_address/company', 'default_billing', null, 'left')
->joinAttribute('billing_street', 'customer_address/street', 'default_billing', null, 'left')
->joinAttribute('billing_postcode', 'customer_address/postcode', 'default_billing', null, 'left')
->joinAttribute('billing_telephone', 'customer_address/telephone', 'default_billing', null, 'left')
->joinAttribute('billing_city', 'customer_address/city', 'default_billing', null, 'left')
->joinAttribute('billing_region', 'customer_address/region', 'default_billing', null, 'left')
->joinAttribute('billing_country_id', 'customer_address/country_id', 'default_billing', null, 'left');
//Add a page size to the result set.
$collection->setPageSize(100);
//discover how many page the result will be.
$pages = $collection->getLastPageNumber();
$currentPage = 1;
//This is the file to append the output to.
$fp = fopen('/tmp/customers.csv', 'w');
do{
//Tell the collection which page to load.
$collection->setCurPage($currentPage);
$collection->load();
foreach ($collection as $customer){
//write the collection array as a CSV.
$customerArray = $customer->toArray();
//var_dump($customerArray); echo "\n\n";
fputcsv($fp, $customerArray);
$customerCount++;
}
$currentPage++;
//make the collection unload the data in memory so it will pick up the next page when load() is called.
$collection->clear();
} while ($currentPage <= $pages);
fclose($fp);
} catch (Exception $e) {
//$response['error'] = $e->getMessage();
Mage::printException($e);
}
echo "Saved $customerCount customers to csv file \n";
?>