2016-02-09 4 views
10

Ich versuche, den Block, der das Menü anzeigt (z. B. ein Modul von Cmssmart_megamenu), zwischenzuspeichern.Magento-Cache - Regel, Cache zu bereinigen

Die Vorgängerversion war:

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

So der Autor explicetly wurde deaktivieren Cache. Ich habe die 2 unsetData entfernt und eine _construct() -Methode in der Cmsmart_Megamenu_Block_Navigation-Klasse hinzugefügt.

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

Es klingt wie es funktioniert, kann ich die Cache-Datei sehen: mage --- 8ea_MY_KEY_MEGA_MENU. in Var/Cache. Allerdings verschwindet es innerhalb von einer Minute aus dem Cache. Eigentlich sobald der nächste Cron startet (es ist jede mn geplant)

Ich habe Aoe-template_hint und ich kann eine grüne Box für diesen Block sehen, was bedeutet, dass es im Cache gespeichert ist, mit auch die Lebensdauer richtig auf 86400 eingestellt, so Was ist los mit dir?

das ist mein erster Versuch, was denkst du ist hier falsch? Gibt es eine andere Regel als die Dauer für das Ablaufen einer Datei? Vielleicht gibt es einen versteckten Link zu einem anderen Block, der früher abläuft? ein Cache von weniger als 1 Mio. ist sowieso seltsam ...

Hinweis: Ich habe das gleiche Problem unter Windows oder Linux, und mit oder ohne Redis

dank

+0

Haben Sie versucht, mit einem Cache-Tag total erfunden?Etwas aus heiterem Himmel wie eine Zeichenfolge 'my_own_cache_tag', nur um sicher zu sein, dass es tatsächlich keinen Cron gibt, der auf der Grundlage des Core-Cache-Tags, das Sie dort verwenden, eine Bereinigung durchführt? –

+0

ja ich tat, das gleiche gilt – Rod

+0

haben versucht, override 'public function toHtml()' und das Hinzufügen eines 'echo 'cache_lifetime ist:'. $ this-> getCacheLifetime(); return elter :: toHtml(); 'Dort? Zwei Dinge sollten passieren: Wenn der Cache kalt ist (nicht erstellt), sollte er die cache_lifetime wiedergeben, die Sie in Ihrem Konstrukt angegeben haben. Wenn der Cache aufgebaut ist (warm), sollte er keine cache_lifetime enthalten. –

Antwort

1

nach mehr Untersuchung fand ich, warum der Cache meines Blockes entfernt wurde.

ich für Anrufe Methoden gesucht, die den Cache reinigen und ich fand es zu einem Modul zurückzuführen war, die tatsächlich explizit alle Caches bei jedem Cron, indem Sie diese blockieren Entfernung wurde:

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

ich die Linie entfernt, und es geht jetzt gut! Das Modul war async_index

2

Ein Grund sein könnte, wenn Sie tatsächlich tun Sie eine parent::_construct() am Ende Ihrer eigenen _construct, dass Sie uns nicht zeigen.

Denn auf meine Version von Magento (1.9.22), sehe ich in der _construct von Mage_Catalog_Block_Navigation, die Magento tut:

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

Damit Linie $this->addData(array('cache_lifetime' => false)); wird nur Ihre Set außer Kraft setzen.

Eine Möglichkeit wäre es dann zu lösen sein, um parent::_construct()erste dann Ihre eigene cache_lifetime

wie folgt hinzu:

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 
} 

sein könnte Ein anderer Weg, nur die Methoden außer Kraft setzen, um diese Informationen zu erhalten über Cache, die gerade mit dem magischen Getter von Varien_Object sind und so etwas tun:

/* 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); 
}