2016-02-09 19 views
10

Provo a memorizzare nella cache il blocco che visualizza il menu (ad esempio un modulo da Cmssmart_megamenu).Magento cache - Regola per pulire la cache

La versione precedente era:

<block type="megamenu/navigation" name="catalog.topnav.megamenu"> 
    <action method="unsetData"><key>cache_lifetime</key></action> 
    <action method="unsetData"><key>cache_tags</key></action> 
</block> 

Così l'autore è stato explicetly invalidante cache. Ho rimosso i 2 unsetData e aggiunto un metodo _construct() nella classe Cmsmart_Megamenu_Block_Navigation.

class Cmsmart_Megamenu_Block_Navigation extends Mage_Catalog_Block_Navigation 
{ 

protected function _construct() 
    $this->addData(array(
    'cache_lifetime' => 86400, 
    'cache_key'  => "my_key_mega_menu", 
    'cache_tags'  => array(Mage_Catalog_Model_Category::CACHE_TAG, Mage_Cms_Model_Block::CACHE_TAG) 
)); 

Suona come funziona, posso vedere il file di cache: mago --- 8ea_MY_KEY_MEGA_MENU. in var/cache. Tuttavia, scompare dalla cache dopo un minuto. In realtà non appena inizia il prossimo cron (è programmato ogni mn)

Ho usato Aoe-template_hint e posso vedere una casella verde per questo blocco, il che significa che è memorizzato nella cache, con anche la durata impostata correttamente su 86400, quindi Cosa c'è che non va?

questo è il mio primo tentativo, cosa pensi sia sbagliato qui? Esiste un'altra regola oltre alla durata della scadenza di un file? Forse c'è un link nascosto con un altro blocco che scade prima? una cache di meno di 1 min è strano comunque ...

Nota: Ho lo stesso problema su Windows o Linux, e con o senza Redis

grazie

+0

Hai provato con un tag della cache completamente inventato?Qualcosa di inaspettato come una stringa 'my_own_cache_tag' solo per essere sicuro che non ci sia davvero un cron che esegue una pulizia basata sul tag di cache di base che stai usando lì? –

+0

sì, lo stesso si applica – Rod

+0

deve provare a sovrascrivere 'public function toHtml()' e aggiungere un 'echo 'cache_lifetime è:'. $ This-> getCacheLifetime(); return parent :: toHtml(); 'Lì? Dovrebbero accadere due cose: se la cache è fredda (non creata) dovrebbe echeggiare il cache_lifetime che hai specificato nel tuo costrutto, se la cache è costruita (calda) non dovrebbe echeggiare alcun cache_lifetime. –

risposta

1

dopo ulteriori indagini, ho scoperto perché la cache del mio blocco è stata rimossa.

Ho cercato per le chiamate a metodi che pulire la cache e ho scoperto che era a causa di un modulo che è stato effettivamente esplicitamente rimuovendo tutte le cache bloccano in ogni cron in questo modo:

Mage::app()->getCacheInstance()->cleanType('block_html'); 

ho rimosso la linea, e va bene ora! Il modulo era async_index

2

Una ragione potrebbe essere, se si Effettivamente fare un parent::_construct() alla fine del proprio _construct che non ci stai mostrando.

Perché sulla mia versione di Magento (1.9.22), vedo nel _construct di Mage_Catalog_Block_Navigation che Magento sta facendo:

protected function _construct() 
{ 
    $this->addData(array('cache_lifetime' => false)); 
    $this->addCacheTag(array(
     Mage_Catalog_Model_Category::CACHE_TAG, 
     Mage_Core_Model_Store_Group::CACHE_TAG 
    )); 
} 

modo che la linea $this->addData(array('cache_lifetime' => false)); sarà solo ignorare il set.

Un modo per risolverlo sarebbe quindi a parent::_construct()prima quindi aggiungere il proprio cache_lifetime

Ti piace questa:

protected function _construct(){ 
parent::_construct(); // that calls the parent, then you override the cache_lifetime 

    $this->addData(array(
    'cache_lifetime' => 86400, 
    'cache_key'  => "my_key_mega_menu", 
    'cache_tags'  => array(Mage_Catalog_Model_Category::CACHE_TAG, Mage_Cms_Model_Block::CACHE_TAG) 
)); 

    // parent::_construct(); but if you have it there, it will cause issues because this will override your settings 
} 

Un altro percorso potrebbe essere quello di sostituire solo i metodi per ottenere quelle informazioni su cache che sono in questo momento usando il getter magico di Varien_Object e fare qualcosa del tipo:

/* That is not even needed anymore 
protected function _construct(){ 
    $this->addData(array(
    'cache_lifetime' => 86400, 
    'cache_key'  => "my_key_mega_menu", 
    'cache_tags'  => array(Mage_Catalog_Model_Category::CACHE_TAG, Mage_Cms_Model_Block::CACHE_TAG) 
)); 
}*/ 

public function getCacheLifetime() { 
    return 86400; 
} 

public function getCacheKey() { 
    return 'my_key_mega_menu'; 
} 

public function getCacheTags() { 
    return array(Mage_Catalog_Model_Category::CACHE_TAG, Mage_Cms_Model_Block::CACHE_TAG); 
} 
Problemi correlati