2012-07-05 61 views
5

我正在阅读大量有关Magento API,Magento模型和Direct SQL调用的文档。正如我读到的那样,第一个结论是,直接的sql调用会更快,但我必须特别注意安全性,模型的使用会使开发速度更快,更容易,但另一方面,它会失去性能操纵巨大目录。什么是导出巨大的Magento目录的最佳方式

我将不得不面对一个有大约50k产品的商店&繁忙的流量,我必须一次性将它们导出到另一台具有类别层次结构,sku,description,image,product_name,url_path的服务器每小时一次。最好的方法是使用直接的sql调用,但使用模型会自杀吗?你认为将其与SOAP API集成将是另一种自杀,我应该在一个单独的PHP中做到这一点?

提前超级感谢,我很失落,在这一点,我的英语不好 维尼

+0

“会不会是自杀” - 我看你已经熟悉了magento! :D – dmp

+0

不要忘记图片! – dmp

回答

1

这里有很多考虑因素。我在谈论这个问题,因为我有类似的问题。我目前使用SQL从magento商店获取数据到XML。实际上,使用sql可以使它更快,只要你知道你正在提取的属性。例如。如果你的产品有15个属性,那就意味着使用sql的50k x 15个属性。但至少你会从版本问题中解脱出来,因​​为你使用的是sql语句。

另一方面...使用模型和API提供了很多版本问题,特别是如果您正在开发几个magento版本。另外一个问题是关于magento自定义属性。例如。如果我添加另一个名为'US SPECIAL SHIPPING'的属性,API变得非常困难。

如果您不介意......您只需对所有属性进行直接sql调用并将其保存为xml。这意味着你需要非常快速的机器来做到这一点。

在提供比较引擎的magento连接上有一个扩展。它可能适合您的出口需求。尝试一下。 price comparison script

<?php 

set_time_limit(3000); 
ini_set('memory_limit', '-1'); 
include_once 'app/Mage.php'; 
umask(0); 
Mage::app(); 
$products = Mage::getModel('catalog/product')->getCollection(); 
$products->addAttributeToSelect('*'); 
$products->load(); 
$baseUrl = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);      
    $output = '<?xml version="1.0" encoding="utf-8"?> 
    <products>'; 
if (count($products)): 

    foreach ($products as $id => $product): 

    $url = $product->getProductUrl(); 
    $output .= ' 
    <product> 
    <id>'. $product['entity_id'].'</id> 
    <name><![CDATA['. $product['name'] .']]></name> 
    <sku>'. $product['sku'] .'</sku> 
    <description><![CDATA['. $product['description'] .']]></description> 
    <shortdescription><![CDATA['. $product['short_description'] .']]></shortdescription> 
    <price><![CDATA['. $product['price'] .']]></price> 
    <minimalprice>'. $product['minimal_price'] .'</minimalprice> 
    <weight><![CDATA['. $product['weight'] .']]></weight> 
    <categories><![CDATA['. $product['categories'] .']]></categories> 
    <color><![CDATA['. $product['color'] .']]></color> 
    <condition><![CDATA['. $product['condition'] .']]></condition> 
    <availability><![CDATA['. $product['availability'] .']]></availability> 
    <shipping><![CDATA['. $product['shipping'] .']]></shipping> 
    <url><![CDATA['. $url.']]></url> 
    <meta><![CDATA['. $product['meta_keyword'] .']]></meta> 
    <metadescription><![CDATA['. $product['meta_description'] .']]></metadescription> 
    <manufacturer><![CDATA['. $product['manufacturer'] .']]></manufacturer> 
    <brand><![CDATA['. $product['brand'] .']]></brand> 
    <upc><![CDATA['. $product['upc'] .']]></upc> 
    <mpn><![CDATA['. $product['mpn'] .']]></mpn> 
    <image><![CDATA['. $baseUrl ."media/catalog/product". $product['image'] .']]>  </image>'; 
    if (isset($attributes[$product['entity_id']])) { 
    $output .= ' 
    <attributes>'; 
    foreach ($attributes[$product['entity_id']] as $attribute => $values) 
    $output .= ' 
    <attribute> 
    <name>'. $attribute .'</name> 
     <values>'. join(', ', $values) . '</values> 
    </attribute>'; 
    $output .= ' 
</attributes>'; 
    } 

$output .= ' 
</product>'; 
endforeach; 
endif; 
header ("Content-Type: text/xml; charset=ISO-8859-1"); 
print $output .= ' 
</products>'; 
?> 
+0

感谢您的回答!我正在测试服务器的开销,因为服务器每次都有大量的访问权限,所以一次完成所有操作都是非常耗时的。所以我的想法是使用模型作为其他人提到的脚本,因为直接进行sql调用将会很困难,因为我需要处理很多不同的Magento版本,并且我希望在未来的未来使用它更新而不必担心。因此,我将通过仅获取当前使用的数据来使其更具互动性,然后将其缓存到第三方服务器上,并且仅在其到期时将其缓存起来 –

+0

我会再次向服务器请求这些数据。 –

+0

伟大的解决方案!我将如何将其制作成CSV文件? – Ismailp

1

1)SOAP API超过了50K产品的现场服务器遗憾会很慢。
2)直接的sql调用会非常麻烦,因为EAV结构的写入会造成很大的麻烦。3)为了防止活动服务器占用大量数据库,使用数据库的只读副本,使用它在本地/另一台服务器上安装magento。并在此工作。

+0

我记住了,我将在分离的PHP中使用模型。谢谢! –

1

当我将Magento产品导出到Google购物时,我遇到了同样的问题。它总是超时(可能是由于我的Feed中有太多产品)。

做一些研究magento exporting后,我试图改变我的php.ini设置这些值:

ini_set(’max_execution_time’,’1800’); 
ini_set(’memory_limit’,’1024M’); 

它完美地工作!

相关问题