Magento cache - правило для очистки кеша

Я пытаюсь кэшировать блок, который отображает меню (например, модуль из Cmssmart_megamenu).

Предыдущая версия:

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

Таким образом, автор явно отключил кеш. Я удалил 2 unsetData и добавил метод _construct() в классе 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)
));

Кажется, что это работает, я вижу файл кеша: mage --- 8ea_MY_KEY_MEGA_MENU. в var/cache. Тем не менее, он исчезает из кеша через минуту. Фактически, как только начнется следующий cron (он запланирован каждый mn)

Я использовал Aoe-template_hint, и я могу видеть зеленый блок для этого блока, то есть он кэшируется, а также срок жизни установлен правильно на 86400, так что неправильно?

что моя первая попытка, что вы думаете здесь не так? Есть ли другое правило, чем продолжительность истечения срока действия файла? Может быть, есть скрытая связь с другим блоком, который истекает раньше? кеш менее 1 млн. странно в любом случае...

Примечание. У меня такая же проблема в Windows или Linux, и с Redis или без него.

спасибо

Ответ 1

после дальнейшего расследования я обнаружил, почему кеш моего блока был удален.

Я искал вызовы методам, которые очищают кеш, и я обнаружил, что это связано с модулем, который на самом деле явно удаляет все блоки кэшей в каждом cron, делая это:

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

Я удалил линию, и теперь все идет хорошо! Модуль был async_index

Ответ 2

Одна из причин может быть, если вы действительно делаете parent::_construct() в конце своего собственного _construct, который вы не показываете нам.

Поскольку в моей версии Magento (1.9.22) я вижу в _construct of Mage_Catalog_Block_Navigation, что Magento делает:

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

Итак, строка $this->addData(array('cache_lifetime' => false)); просто переопределит ваш набор.

Тогда способ решить это будет parent::_construct() сначала, а затем добавить свой собственный cache_lifetime

Вот так:

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
}

Другой путь может состоять в том, чтобы просто переопределить методы, чтобы получить информацию о кеше, которые сейчас используются с помощью магического приемника Varien_Object и сделать что-то вроде:

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