2013-03-14 48 views
6

Ive ha notato che la mia home page impiega molto tempo per essere caricata - oltre 6 secondi infatti in base a site24x7.com, quindi sono stato disattivato gli elementi per cercare di determinare qual è la causa, ed è giù a 2 file di raccolta prodotti che ho realizzato per mostrare nuovi prodotti e prodotti più venduti.Magento come memorizzare nella cache un prodottoCollection

Non appena li rimuovo dalla home page, la pagina viene caricata in meno di 0,5 secondi.

Quindi, qualcuno può aiutare con l'ottimizzazione e la memorizzazione nella cache di un prodottoCollection? Ho APC installato e in esecuzione sul server, ma non sono sicuro che stia memorizzando nella cache i file situati in app/design/frontend/default/MY_THEME/catalog/product/newproducts.phtml

Quindi, la mia raccolta chiama per la migliore vendita (il più visto in realtà) assomiglia a questo;

<?php $storeId = Mage::app()->getStore()->getId(); // return current store id ?> 
    <?php $_productCollection= Mage::getResourceModel('reports/product_collection') 
    ->addAttributeToSelect('*') 
    ->addStoreFilter($storeId) 
    ->addViewsCount() 
    ->addFieldToFilter('visibility', Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH) 
    ->addFieldToFilter('status',Mage_Catalog_Model_Product_Status::STATUS_ENABLED); 
    $_productCollection->getSelect()->limit(8) 
    ?> 

Come ottimizzarlo ulteriormente?

risposta

7

Prova

$storeId = Mage::app()->getStore()->getId(); 
    $cache = Mage::getSingleton('core/cache'); 
    $key = 'homepage-most-view-' . $storeId; 

    if(! $data = $cache->load($key)){ 
     $_productCollection= Mage::getResourceModel('reports/product_collection') 
     ->addAttributeToSelect('*') 
     ->addStoreFilter($storeId) 
     ->addViewsCount() 
     ->addFieldToFilter('visibility', Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH) 
     ->addFieldToFilter('status',Mage_Catalog_Model_Product_Status::STATUS_ENABLED); 
     $_productCollection->getSelect()->limit(8) 
     // get the element you need from $_productCollection and store in $array 
     $data = serialize($array); 
     $cache->save(urlencode($data), $key, array("homepage_cache"), 60*60*24); 
    } 
    else{ 
     $data = unserialize(urldecode($data)); 
} 

Vedi

+0

ringraziamento, esattamente il tipo di intel che cercavo! –

+0

@ R.S Perché usi 'urlencode' due volte? È necessario o è un bug qui? Non dovrebbe essere questo: '$ data = urlencode (serialize ($ array)); $ cache-> save ($ data, $ key, array ("homepage_cache"), 60 * 60 * 24); '? – zitix

+0

E 'stato un errore di battitura .. risolto ora –

0

Se si desidera memorizzare nella cache $ collezione, v'è già un built-in possibilità per la raccolta memorizzazione nella cache in Magento.

$_productCollection= Mage::getResourceModel('reports/product_collection'); 

$cache = Mage::app()->getCache(); //Let's get cache instance 
     $cache->setLifetime(86400); //Here we set collection cache lifetime 
     $_productCollection->initCache(
      $cache, 
      'Bestsellers_', //this is just custom prefix 
      array('collections') 
     ); 
    } 

di credito per il codice di cui sopra: apiworks.net (http://www.apiworks.net/2015/01/magento-collection-caching.html)

+0

in questo esempio capisco come è stato impostato in alto. Ma è logico che dobbiamo implementare la seconda esecuzione per verificare se esiste una cache e solo dopo salvarla nella cache ... o fa "cache know/do this there own own" thhx! –

+0

Ciao, @ snh_nl. Come puoi vedere nel codice seguente, che fa parte della classe Varien_Data_Collection_Db: http://collabshot.com/show/H0q3bn Magento prova a caricare prima dalla cache e poi se fallisce carica dal database e salva la versione cache . Quindi, la risposta è: per lo stesso oggetto $ collection, non devi fare nient'altro una volta che hai inizializzato la cache usando il codice sopra. Si caricherà automaticamente la prossima volta per te. –

+0

Potremmo usare il codice come questo https://gist.github.com/seansan/1397a892fa496d5b5f98c2d85e4fa82e in un file modello html? Oppure come si memorizza nella cache una chiamata di raccolta in un file phtml (ad esempio l'elenco dei prodotti) –

Problemi correlati