Categorie
Blog

Misurare le performance del codice Magento

In questo breve post vi mostrerò come misurare le performance del vostro codice Magento, in modo tale da capire quali sono le parti che richiedono più memoria o tempi di caricamento lunghi; in base a questo riuscirete a scovare questi “buchi neri” del codice e quindi ad evitare tutto ciò che rende gli e-commerce lenti, poco usabili e poveri in termini di vendite.

La piattaforma Magento ha preinstallato di default il profiler di sistema, ovvero un tool che se attivato mostra il tempo che impiegano le varie chiamate e la memoria che queste utilizzano.

Per attivare il profiler è necessario andare in Sistem -> Configuration -> Advanced -> Developer -> Debug -> Profiler ed impostarlo a Yes.

Andate poi nel vostro index.php nella root del magento e decommentate la linea Varien_Profiler::enable();.

Questa istruzione abiliterà il profiler di magento che apparirà in ogni pagina sotto al footer, ecco a voi uno screenshot del profiler:

Esistono casi in cui volete testare le performances solamente di alcune chiamate o parti di codice, per capire l’impatto che queste avranno sul vostro sito o sulla velocità di risposta; come fare in questi casi?

La soluzione è uno script Magento (passatemi il termine) con incorporato il profiler magento che analizza le chiamate ed il vostro codice.

Ecco qua l’esempio di codice che carica alcuni ordini e mostra i risultati a schermo:

[sourcecode language=”php”]
<?php

error_reporting(E_ALL);
ini_set("display_errors", 1);

require_once ‘app/Mage.php’;

Varien_Profiler::enable();

$app = Mage::app(”);

try {

Varien_Profiler::start(‘Profiler::Load::Order’);
$read = Mage::getSingleton(‘core/resource’)->getConnection(‘core_read’);

$value = $read->query("SELECT * from catalog_product_entity");
$results = $value->fetchAll();

foreach ($results as $res) {
$order = Mage::getModel("sales/order")->load($res["entity_id"]);
}

Varien_Profiler::stop(‘Profiler::Load::Order’);

$timers = Varien_Profiler::getTimers();

#$out = ‘<div style="position:fixed;bottom:5px;right:5px;opacity:.1;background:white" onmouseover="this.style.opacity=1" onmouseout="this.style.opacity=.1">’;
#$out = ‘<div style="opacity:.1" onmouseover="this.style.opacity=1" onmouseout="this.style.opacity=.1">’;
$out = "<h1>Profiler</h1>";//"<a href=\"javascript:void(0)\" onclick=\"$(‘profiler_section’).style.display=$(‘profiler_section’).style.display==”?’none’:”\">[profiler]</a>";
$out .= ‘<div id="profiler_section" style="background:white; display:block">’;
$out .= ‘<pre>Memory usage (bytes): real: ‘ . memory_get_usage(true) . ‘, emalloc: ‘ . memory_get_usage() . ‘</pre>’;
$out .= ‘<pre>Memory usage (Mega): real: ‘ . doubleval(memory_get_usage(true) / 1048576) . ‘, emalloc: ‘ . doubleval(memory_get_usage() / 1048576) . ‘</pre>’;
$out .= ‘<table border="1" cellspacing="0" cellpadding="2" style="width:auto">’;
$out .= ‘<tr><th>Code Profiler</th><th>Time</th><th>Cnt</th><th>Emalloc</th><th>RealMem</th></tr>’;
foreach ($timers as $name => $timer) {
$sum = Varien_Profiler::fetch($name, ‘sum’);
$count = Varien_Profiler::fetch($name, ‘count’);
$realmem = Varien_Profiler::fetch($name, ‘realmem’);
$emalloc = Varien_Profiler::fetch($name, ‘emalloc’);
if ($sum < .0010 && $count < 10 && $emalloc < 10000) {
continue;
}
$out .= ‘<tr>’
. ‘<td align="left">’ . $name . ‘</td>’
. ‘<td>’ . number_format($sum, 4) . ‘</td>’
. ‘<td align="right">’ . $count . ‘</td>’
. ‘<td align="right">’ . number_format($emalloc) . ‘</td>’
. ‘<td align="right">’ . number_format($realmem) . ‘</td>’
. ‘</tr>’
;
}
$out .= ‘</table>’;
$out .= ‘<pre>’;
$out .= print_r(Varien_Profiler::getSqlProfiler(Mage::getSingleton(‘core/resource’)->getConnection(‘core_write’)), 1);
$out .= ‘</pre>’;
$out .= ‘</div>’;

$totalTime = 0;
foreach ($timers as $timer => $ti) {
$sum = Varien_Profiler::fetch($timer, ‘sum’);
$totalTime = doubleval($totalTime) + doubleval($sum);
}
echo $out . "<br/><br/>";
echo "Execution time in seconds: " . $totalTime;
} catch (Exception $e) {
echo $e->getMessage();
Mage::printException($e);
}
?>

[/sourcecode]

Questo è il risultato dello script; come potete notare la parte incapsulata dentro le chiamate “Start” e “Stop” del profiler  è quella che si occupa di racchiudere tutte le chiamate che vengono fatte al suo interno (nel nostro esempio la query degli ordini ed il loro caricamento). Il risultato nel profiler avrà il nome passato al profiler ovvero Varien_Profiler::stop('Profiler::Load::Order');

Categorie
Blog

Icecat: integrazione su Magento

Icecat è il famoso catalogo di prodotti di elettronica disponibile gratuitamente online.

I maggiori produttori di componenti elettronici ed informatici (come HP, Samsung, Intel, Symantech ecc..) inviano in modo continuo il catalogo dei propri prodotti a questo raccoglitore globale che li raggruppa in modo standard e li mette a disposizione di tutti coloro che ne hanno bisogno. Le caratteristiche/dettagli prodotto che questo catalogo globale mette a disposizione sono:

  • Nome del prodotto
  • Nome del produttore
  • Codice del produttore
  • Categoria prodotto
  • Immagini del prodotto
  • Descrizioni in lingue diverse
  • Specifiche tecniche standard
  • Manuali
  • Opzioni (prodotti correlati)
  • Peso
  • Codice EAN

Come possiamo utilizzare Icecat? Ecco un esempio: tutti coloro che vogliono inserire nei propri siti e-commerce la lista di tutte le stampanti disponibili nel mercato possono interrogare Icecat ed ottenere in formato elettronico il catalogo completo di tutti i modelli.

Icecat mette a disposizione delle api per interrogare il suo database prodotti o delle url per reperire informazioni prodotto; inoltre per chi non volesse scaricare l’elenco completo dei prodotti sul proprio sito o e-commerce Icecat mette a disposizione metodi per ottenere nomi, immagini e descrizioni prodotto da caricare direttamente dal loro catalogo online.

Questo è proprio quello che abbiamo fatto: integrare il catalogo Icecat con la piattaforma Magento!

Per l’integrazione di Icecat su Magento abbiamo utilizzato il modulo Icecat Live presente sul Magento Connect; il modulo ha qualche bug che abbiamo però risolto ed il risultato è stato una perfetta integrazione tra il catalogo Icecat e l”ecommerce Magento.

Di quali informazioni abbiamo avuto bisogno?

Sul catalogo prodotti Magento è necessario inserire solamente il codice che identifica il prodotto su Icecat; per farlo è stato necessario inserire su Magento, al posto dello sku del prodotto, il codice identificativo di quel prodotto presso il produttore; faccio un esempio: prendiamo la stampante laser HP LaserJet Pro P1102. Il suo codice identificativo presso il suo produttore HP e presso Icecat è CE651A. Inserendo nello sku prodotto questo codice e mappando lo sku di Magento su questo codice il gioco è fatto.

Ma cosa è questo codice?
Il codice con il quale Icecat mappa i suoi prodotti è chiamato MPN, ovvero il  Manufacturer Part Number.

Nella configurazione del modulo è bastato associare l’MPN al nostro sku ed il modulo, e con qualche piccolo ritocco ha iniziato a funzionare!

Questo è il prodotto su HP con MPN CE651A su Icecat: HP LaserJet Pro P1102

Vediamo adesso come si presenta il prodotto sul nostro Magento di prova installato appositamente per testare e fare funzionare l’integrazione con Icecat.

Ecco il primo risultato, ovvero il prodotto nella lista prodotti della categoria (come potete vedere il prodotto prende da Icecat il nome e l’immagine):

Ed infine la scheda prodotto con le immagini e i particolari tecnici/descrittivi caricati tutti direttamente da Icecat.

 

 

 

 

 

 

 

 

 

 

 

Per tutti coloro che vogliono un catalogo pieno di prodotti, o per tutti coloro che vogliono aggiungere ai propri prodotti descrizioni complete ed esaustive consiglio vivamente di integrare la piattaforma Magento con il famoso catalogo prodotti di elettronica Icecat.