2013-03-14 3 views
6

Ive заметило, что моя домашняя страница занимает много времени, чтобы загрузить - более 6 секунд infact в соответствии с сайтом24x7.com, поэтому ive переключил элементы, чтобы попытаться определить причину, и она не работает к 2 файлам сбора продуктов, которые я сделал, чтобы показать новые продукты и самые продаваемые продукты.Magento как кешировать productCollection

Как только я удаляю их с домашней страницы, страница загружается менее чем за 0,5 секунды.

Итак, может ли кто-нибудь помочь с оптимизацией и кэшированием productCollection? У меня есть APC, установленный и запущенный на сервере, но я не уверен, что он кэширует файлы, расположенные в приложении/дизайне/интерфейсе/по умолчанию/MY_THEME/catalog/product/newproducts.phtml

Итак, мой коллекционный звонок для самых продаваемых (наиболее просматриваемый на самом деле) выглядит следующим образом;

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

Как это можно оптимизировать?

ответ

7

Попробуйте

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

См

+0

спасибо, именно такой разведданных я был после! –

+0

@ R.S Почему вы используете 'urlencode' дважды? Это необходимо или это ошибка здесь? Это не должно быть: '$ data = urlencode (serialize ($ array)); $ cache-> save ($ data, $ key, array ("homepage_cache"), 60 * 60 * 24); '? – zitix

+0

Это была опечатка .. исправлено сейчас –

0

Если вы хотите кэшировать $ коллекции, уже есть встроенная возможность для кэширования сбора в 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') 
     ); 
    } 

Кредит на приведенный выше код: apiworks.net (http://www.apiworks.net/2015/01/magento-collection-caching.html)

+0

в этом примере, я понимаю, как он установлен. Но есть ли логика, нам нужно реализовать второй прогон, чтобы проверить, существует ли кеш, и только затем сохранить его в кеш ... или «кеш знает/делает это из собственного» thhx! –

+0

Привет, @ snh_nl. Как вы можете видеть в следующем коде, который является частью класса Varien_Data_Collection_Db: http://collabshot.com/show/H0q3bn Magento пытается сначала загрузить из кеша, а затем, если сбой, он загружается из базы данных и сохраняет кэшированную версию , Итак, ответ таков: для одного и того же объекта $ collection вам не нужно ничего делать, как только вы инициализировали кеш, используя приведенный выше код. Он автоматически загрузится в следующий раз для вас. –

+0

Можем ли мы использовать код https://gist.github.com/seansan/1397a892fa496d5b5f98c2d85e4fa82e в файле шаблона html? Или как можно кэшировать вызов коллекции в файле phtml (например, список продуктов) –