2012-07-05 8 views
5

Sto leggendo un sacco di documenti sull'API di Magento, i modelli di Magento e le chiamate Direct SQL. Mentre stavo leggendo, la prima conclusione è che le chiamate dirette a sql sarebbero molto più veloci, ma devo prestare particolare attenzione alla sicurezza, e l'uso di modelli rende lo sviluppo più veloce e più facile ma, d'altra parte, perde prestazioni manipolando enormi cataloghi.Qual è il modo migliore per esportare enormi cataloghi Magento

Avrò a che fare con un negozio con circa 50k di prodotti & traffico intenso e devo esportarli su un altro server con gerarchia di categorie, sku, descrizione, immagine, nome_prodotto, url_path una volta e dopo aver ottenuto solo l'aggiornamento quelli una volta ogni ora. L'approccio migliore sarebbe con le chiamate dirette, ma sarà un suicidio farlo con le modelle? E pensi che integrarlo con l'API SOAP sarà un altro suicidio, e dovrei farlo in un PHP separato per farlo?

Super grazie in anticipo, sono molto perso a questo, e mi dispiace per il mio cattivo inglese Vinicius

+0

"sarà un suicidio" - Vedo che hai già esperienza con Magento! : D – dmp

+0

non dimenticare anche le immagini! – dmp

risposta

1

Ci sono molte considerazioni qui. Sto parlando di questo perché ho un problema simile. Attualmente sto usando SQL per ottenere i dati da Magento Store in XML. Veramente, usare sql può renderlo più veloce SOLO se conosci gli attributi che stai recuperando. per esempio. se i tuoi prodotti hanno 15 attributi, ciò significa 50k x 15 attributi usando sql. Ma almeno sarai libero dai problemi di versione perché stai usando istruzioni SQL.

D'altra parte ... l'uso di modelli e API offre molti problemi di versione, specialmente se si stanno sviluppando diverse versioni di Magento. Un altro problema riguarda gli attributi personalizzati di Magento. Per esempio. Se aggiungo un altro attributo chiamato "SPEDIZIONE SPECIALE DEGLI STATI UNITI", diventa piuttosto difficile con l'API.

Se non ti dispiace ... devi solo effettuare una chiamata sql diretta a tutti i tuoi attributi e salvarli su xml. Ciò significa che hai bisogno di una macchina molto veloce per farlo.

C'è un'estensione su Magento Connect che serve i motori di confronto. Potrebbe adattarsi alle tue esigenze di esportazione. Provalo. 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

Grazie per la tua risposta! Stavo testando l'overhead del server e sarebbe troppo mangiatore di risorse per fare tutto in una volta, dato che il server ha già un accesso pesante ogni volta.Quindi la mia idea era quella di creare uno script usando i modelli come l'altro menzionato, perché fare chiamate sql dirette sarà difficile dato che avrò bisogno di gestire molte diverse versioni di Magento e voglio farlo funzionare con il prossimo futuro aggiornamenti senza doversi preoccupare troppo. Quindi renderò più interattivo ottenendo solo i dati che userò in quel momento, e poi lo coccherò sul server di terze parti e solo quando scade –

+0

Richiederò di nuovo questi dati al server. –

+0

Ottima soluzione! Come potrei fare per rendere questo in un file CSV? – Ismailp

1

1) API SOAP su server di vivere per 50K prodotti sarà molto lenta.
2) le chiamate sql dirette sarebbero molto complicate da scrivere a causa della struttura EAV
3) per impedire l'esecuzione del server live, eseguire una replica di lettura del database, utilizzarlo per installare Magento su locale/un altro server. e lavorarci su

+0

L'ho preso in considerazione e userò i modelli in un PHP separato. Grazie! –

1

ho avuto lo stesso problema quando si esportano i miei prodotti Magento a Google Shopping. È sempre scaduto (probabilmente a causa di troppi prodotti nel mio feed).

Dopo aver fatto qualche ricerca in magento exporting, ho provato a cambiare le mie impostazioni di php.ini per questi valori:

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

e ha funzionato perfettamente!