2013-03-14 12 views
6

Ich habe bemerkt, dass meine Homepage eine lange Zeit dauert, um zu laden - über 6 Sekunden nach Site24x7.com, so habe ich Elemente ausgeschaltet, um zu versuchen, festzustellen, was die Ursache ist, und es ist down zu 2 Produkt-Sammeldateien, die ich gemacht habe, um neue Produkte und meistverkaufte Produkte zu zeigen.Magento wie man eine productCollection zwischenspeichert

Sobald ich diese von der Homepage entferne, wird die Seite in weniger als 0,5 Sekunden geladen.

Kann jemand bei der Optimierung und Zwischenspeicherung einer productCollection helfen? Ich habe APC installiert und läuft auf dem Server, aber ich bin nicht sicher, dass es die Dateien in app/design/frontend/default/MY_THEME/catalog/product/newproducts.phtml

im Cache Caching für den besten Verkauf (am meisten gesehen tatsächlich) sieht so aus;

<?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) 
    ?> 

Wie kann ich das weiter optimieren?

Antwort

7

Versuchen

$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)); 
} 

Siehe

+0

Sie danken, genau die Art von Intel, nachdem ich war! –

+0

@ R.S Warum benutzen Sie 'urlencode' zweimal? Ist es notwendig oder ist es ein Fehler hier? Sollte dies nicht sein: '$ data = urlencode (serialize ($ array)); $ cache-> save ($ data, $ key, array ("homepage_cache"), 60 * 60 * 24); '? – zitix

+0

Es war ein Tippfehler .. jetzt behoben –

0

Wenn Sie $ Sammlung gecached werden sollen, gibt es bereits eine eingebaute Möglichkeit zur Sammlung Caching 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') 
     ); 
    } 

Kredit für obigen Code: apiworks.net (http://www.apiworks.net/2015/01/magento-collection-caching.html)

+0

in diesem Beispiel verstehe ich, wie oben eingestellt. Aber gibt es Logik, die wir brauchen, um den zweiten Lauf zu implementieren, um zu prüfen, ob ein Cache existiert und ihn dann nur im Cache zu speichern ... oder "kennt diesen Cache von dort" thhx! –

+0

Hallo, @ snh_nl. Wie Sie im folgenden Code sehen können, der Teil der Varen_Data_Collection_Db-Klasse ist: http://collabshot.com/show/H0q3bn Magento versucht zuerst, aus dem Cache zu laden, und wenn es fehlschlägt, lädt es aus der Datenbank und speichert die zwischengespeicherte Version . Die Antwort lautet also: Für dasselbe $ collection-Objekt müssen Sie nichts anderes tun, wenn Sie den Cache mit dem obigen Code initialisiert haben. Es wird automatisch das nächste Mal für Sie geladen. –

+0

Könnten wir den Code wie folgt verwenden https://gist.github.com/seansan/1397a892fa496d5b5f98c2d85e4fa82e in einer HTML-Template-Datei? Oder wie würde man einen Sammelaufruf in eine PHP-Datei zwischenspeichern (zB Produktliste) –

Verwandte Themen