Come aggiornare gli indici su Magento

La ricostruzione degli indici dei dati in Magento è un’operazione fondamentale, che permette di avere un catalogo prodotti sempre aggiornato e si rende spesso necessaria dopo attività di modifica delle informazioni.
Ma prima di passare alla pratica, è bene fissare qualche concetto teorico, per comprendere come lavora Magento e soprattutto quando e perché si rende necessaria la reindicizzazione dei dati.
- Leggi l'articolo, ti bastano solo 2 minuti, 31 secondi
Sei di fretta? Scarica il PDF e consultalo quando vuoi!
Sommario
Normalizzazione del database
Una delle prime nozioni da imparare quando si lavora con i database, è il concetto di normalizzazione. Non mi dilungherò troppo sulla questione, ma giusto per rinfrescare un po’ la memoria:
La normalizzazione è un procedimento che ha lo scopo di eliminare la ridondanza di dati, fornendo al database una struttura che limiti il più possibile il rischio di incoerenza dei dati, decomponendo le relazioni tra essi in relazioni via via più piccole.
Magento, con il suo database, non fa eccezione e rispetta questa consuetudine, ma allo stesso tempo consente una strada alternativa.
Vediamo le differenze sostanziali, analizzando i pro e contro dell’una e dell’altra soluzione.
EAV Catalog vs FLAT Catalog
L’organizzazione delle tabelle in forma “normale”, si basa sulla corrispondenza Entità-Attributo-Valore: i dati vengono memorizzati in differenti tabelle relazionate tra loro.
Questo implica che per ottenere le informazioni, ad esempio, su un prodotto è necessaria una query complessa che prevede 5-6 operazioni di join. La distribuzione dei dati su più tabelle, comporta una grande flessibilità ed estensibilità, nonché una forte riduzione della ridondanza dei dati (conseguenza proprio del processo di normalizzazione), ma al contempo l’utilizzo di molteplici join tra le tabelle riduce sensibilmente le performance, in termini di velocità.
L’alternativa proposta da Magento, è l’utilizzo del catalogo FLAT che consiste nella memorizzazione dei dati in una unica tabella, non normalizzata. Conseguenza di questo tipo di sistema, sono un notevole aumento dello spazio occupato nel database, in quanto la stessa informazione, anche se condivisa tra più prodotti, verrà replicata per ogni riga; ma il grosso vantaggio, è la possibilità di accedere a tutti i dati di cui si ha bisogno effettuando una unica query, che il database ci fornirà in molto meno tempo.
Nota nella prima immagine, come i valori evidenziati siano ripetuti per ben tre volte (flat), mentre nella seconda, lo stesso dato viene memorizzato una sola volta e richiamato tramite future operazioni di join (eav).
Come abilitare il Flat catalog
Come opzione di default, Magento fornisce la memorizzazione dei dati basata sul catalogo di tipo EAV, ma è possibile scegliere il formato Flat dal backend di Magento andando su:
Sistema > Configurazione
nel menu in alto, e scegliere:
CATALOGO
nel menu laterale. Nella tab:
FRONTEND
ti basta selezionare SI nelle opzioni:
USA IL CATALOGO FLAT PER I PRODOTTI
e
USA IL CATALOGO FLAT PER LE CATEGORIE
ed il gioco è fatto!
La reindicizzazione delle informazioni
Nel caso di cataloghi di tipo Flat, Magento utilizza gli “indexers”, una serie di funzioni che periodicamente (tramite i cron jobs) aggiornano e popolano le tabelle flat, elaborando e indicizzando i dati per garantire una elevata velocità di lettura.
Si tratta di una pratica molto indicata in caso di cataloghi con molti prodotti, per avere delle performance sempre elevate; tutti i calcoli relativi a prezzi (con relativa applicazione di tassazioni, sconti, ecc.), gestione delle scorte (soprattutto in caso di prodotti bundle), vengono effettuati durante l’indicizzazione e memorizzati già pronti per essere visualizzati, senza la necessità di essere rigenerati ad ogni richiesta, con un notevole risparmio di risorse e di tempo.
Ad esempio, la semplice visualizzazione del prezzo di vendita finale di un prodotto, è la risultante di molteplici calcoli: bisogna tener conto di eventuali regole di sconto, tier pricing, listini diversi applicati ad ogni gruppo utenti, applicazione delle tasse ed effettuare questi calcoli per ogni utente che visualizza una pagina del tuo e-commerce richiede tempo e potrebbe tradursi in un carrello abbandonato. Ma questo è da evitare, giusto?
Una volta attivato il Flat catalog, Magento opererà una “traduzione e riorganizzazione” delle informazioni e le disporrà su una unica tabella. Ma cosa succede se viene creata ad esempio una regola di sconto nuova?
Magento ha pensato anche a questo e ti avvisa che è necessario effettuare la reindicizzazione dei dati affinché vengano aggiornati e ricalcolati.
Come effettuare il reindex in Magento
Magento dispone di otto indexers, che si occupano ciascuno di aggiornare diversi raggruppamenti di dati. Eccoli nel dettaglio:
- Attributi prodotto
- Prezzi prodotto
- URL rewrites del catalogo
- Dati prodotto Flat
- Prodotti categoria
- Indice di ricerca nel catalogo
- Stato scorte
- Tag dei dati aggregati
Esistono sostanzialmente tre modalità di aggiornamento degli indici, eccole una per una.
Reindex da admin
La più semplice e la più utilizzata, è quella effettuata da pannello di amministrazione. Per avviarla, ti basta entrare nel backend di Magento ed andare su:
Sistema > Gestione indice
nel menu in alto. Qui Magento segnala gli indici che necessitano di essere aggiornati.
Per farlo, basta selezionare uno o più indici da aggiornare, dopodiché a destra, nel menu a tendina “Azioni”, scegli:
REINDICIZZAZIONE INFORMAZIONI
ed infine clicca su:
INVIA
Fatto?
Ora il tuo catalogo è pronto ed aggiornato!
Reindex da SSH
È possibile lanciare le operazioni di aggiornamento degli indici anche attraverso riga di comando, accedendo in SSH al server ed utilizzando i seguenti comandi, ciascuno per ognuno degli indexers precedentemente elencati:
php shell/indexer.php -reindex catalog_product_attribute php shell/indexer.php -reindex catalog_product_price php shell/indexer.php -reindex catalog_url php shell/indexer.php -reindex catalog_product_flat e php shell/indexer.php -reindex catalog_category_flat php shell/indexer.php -reindex catalog_category_product php shell/indexer.php -reindex catalogsearch_fulltext php shell/indexer.php -reindex cataloginventory_stock php shell/indexer.php -reindex tag_summary
Per eseguirli tutti in una volta, ti basta digitare:
php shell/indexer.php -reindexall
Reindex da script PHP
Infine, è possibile effettuare l’aggiornamento degli indici anche tramite funzioni PHP (magari al termine di uno script di inserimento massivo dei prodotti). Se non sai come creare uno script per utilizzare le funzioni Magento in un file esterno, ti consiglio di dare una sbirciata a:
La funzione da utilizzare è:
// clear cache Mage::app()->removeCache( 'catalog_rules_dirty' ); // reindex Mage::getModel( 'index/process' )->load( 2 )->reindexEverything();
dove il numero presente come parametro della funzione load() alla riga 4, sta ad indicare l’ID dell’indexer da richiamare, secondo la legenda:
1 = Product Attributes
2 = Product Attributes
3 = Catalog URL Rewrites
4 = Product Flat Data
5 = Category Flat Data
6 = Category Products
7 = Catalog Search Index
8 = Tag Aggregation Data
9 = Stock Status
Mentre la funzione per eseguirli tutti in una sola volta è:
$oCollection = Mage::getModel( 'index/process' )->getCollection(); foreach ( $oCollection as $oIndex ) { $oIndex->reindexAll(); }
Sbloccare la reindicizzazione degli indici
Qualche volta potrebbe capitare che il processo di indicizzazione possa rimanere bloccato, spesso perché interrotto bruscamente in maniera anomala, magari a seguito di un blocco o un riavvio del server. In questo caso, un fastidioso messaggio comparirà ad ogni tentativo di effettuare un nuovo aggiornamento degli indici:
Index process is working now. Please try run this process later
Come fare?
Quando Magento effettua un reindex, genera un file di “lock” nella cartella:
/var/locks/
il quale serve al sistema come controllo per non eseguire alcune operazioni che potrebbero interferire con l’indicizzazione. È sufficiente eliminare la cartella ed il gioco è fatto, il reindex è pronto per essere eseguito nuovamente.