2012-07-05 13 views
5

Czytam mnóstwo dokumentów na temat interfejsu API Magento, modeli Magento i bezpośrednich wywołań SQL. Kiedy to czytałem, pierwszym wnioskiem jest to, że bezpośrednie połączenia sql byłyby szybsze, ale muszę zachować szczególną ostrożność w zakresie bezpieczeństwa, a użycie modeli sprawia, że ​​tworzenie jest szybsze i łatwiejsze, ale z drugiej strony traci wydajność manipulując ogromnymi katalogi.Jaki jest najlepszy sposób na eksport dużych katalogów Magento?

Będę musiał załatwić sklep z około 50 tys. Produktów o dużym natężeniu ruchu i muszę wyeksportować je na inny serwer z hierarchią kategorii, sku, opisem, obrazem, nazwą produktu, ścieżką url_ raz i po otrzymaniu tylko zaktualizowanego raz na godzinę. Najlepszym rozwiązaniem byłoby bezpośrednie wywoływanie sql, ale czy będzie to samobójstwo, aby zrobić to z modelami? Czy myślisz, że zintegrowanie go z interfejsem API SOAP będzie kolejnym samobójstwem i powinienem zrobić to w oddzielnym PHP, żeby to zrobić?

Super góry dzięki, jestem bardzo stracił na tym i przepraszam za mój zły język angielski Winicjusza

+0

"Czy to będzie samobójstwo" - Widzę, że już masz duże doświadczenie z magento! : D – dmp

+0

nie zapominaj też o obrazach! – dmp

Odpowiedz

1

Istnieje wiele rozważań tutaj. Mówię o tym, bo mam podobny problem. Obecnie używam SQL, aby pobrać dane ze sklepu magento do xml. Naprawdę, używanie sql może sprawić, że będzie to TYLKO szybsze TYLKO, jeśli znasz atrybuty, które pobierasz. na przykład. jeśli twoje produkty mają 15 atrybutów, to znaczy 50k x 15 atrybutów używających sql. Ale przynajmniej uwolnisz się od problemów z wersją, ponieważ używasz instrukcji sql.

Z drugiej strony ... używanie modeli i interfejsu API daje wiele problemów z wersją, zwłaszcza jeśli pracujesz dla kilku wersji magento. Inny problem dotyczy także niestandardowych atrybutów magento. Na przykład. Jeśli dodaję kolejny atrybut o nazwie "US SPECIAL SHIPPING", z interfejsem API staje się dość trudny.

Jeśli nie masz nic przeciwko ... po prostu wykonaj bezpośrednie wywołanie sql do wszystkich atrybutów i zapisz je do xml. To oznacza, że ​​potrzebujesz bardzo, bardzo szybkiej maszyny, aby to zrobić.

Istnieje rozszerzenie Magento, które służy do porównywania silników. Może pasować do twojego eksportu. Spróbuj. 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

Dzięki za odpowiedź! Testowałem obciążenie serwera i byłoby zbyt zasobem zasobów, aby zrobić to wszystko naraz, ponieważ serwer ma już za każdym razem duży dostęp.Więc moim pomysłem było stworzenie skryptu przy użyciu modeli, o których wspomniał inny facet, ponieważ wykonywanie bezpośrednich wywołań sql będzie trudne, ponieważ będę musiał radzić sobie z wieloma różnymi wersjami Magento i chcę, aby działał z następną przyszłością aktualizacje bez obaw również. Więc sprawię, że będzie on bardziej interaktywny, pobierając tylko dane, które będę używać w tym czasie, a następnie buforował je na serwerze zewnętrznym i tylko wtedy, gdy wygasa –

+0

Poproszę te dane ponownie na serwer. –

+0

Świetne rozwiązanie! Jak mam zamiar zrobić to w pliku CSV? – Ismailp

1

1) mydła API na serwerze na żywo 50K produktów będzie bardzo powolny.
2) bezpośrednie połączenia sql byłyby bardzo kłopotliwe w pisaniu ze względu na strukturę EAV
3), aby zapobiec hoggingowi serwera na żywo, weź replikę odczytu bazy danych, użyj jej do zainstalowania magento na lokalnym/innym serwerze. i pracuj nad tym.

+0

Wziąłem to pod uwagę, a zamiast tego użyję modeli w oddzielnym PHP. Dzięki! –

1

miałem identyczny problem przy eksporcie moje produkty Magento do Google Shopping. Przekroczono limit czasu (prawdopodobnie ze względu na posiadanie zbyt wielu produktów w moim pliku danych).

Po robi rozeznanie w magento exporting, próbowałem zmieniając swoje ustawienia php.ini do tych wartości:

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

i to działało idealnie!

Powiązane problemy