2012-07-05 105 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’); 

它完美地工作!

相關問題