3

我想在 Magento Collections Data Collection 数据文件时刷新我的扩展缓存。COLLECTION_DATA 缓存被刷新,其他事件也会刷新,这会清理这个缓存。

我有一个自定义类,主要部分是:

$this->_usecache = Mage::app()->useCache('collections');
if ($this->_usecache){
    $cache = Mage::app()->getCache();
    $key = "mycategory".$this->_config['rootid'];
    $this->tmpAllItems = $cache->load($key);
} else {
    $this->tmpAllItems = false;
}
if ($this->tmpAllItems === false){
    $this->tmpAllItems = array();
    $model = Mage::getModel('catalog/category');
    $categories = $model->getCategories($this->_config['rootid'], 0, true, false, true);
    $k = array_keys($categories->getNodes());
    $parent = $categories[$k[0]]->getParent();
    $this -> treeToFlat($parent);
    if ($this->_usecache) 
    {
         $cache->save(serialize($this->tmpAllItems),
                      $key,
                      array(Mage_Catalog_Model_Category::CACHE_TAG,
                            Mage_Core_Model_App::CACHE_TAG)
                     );
    } else {
        $this->tmpAllItems = unserialize($this->tmpAllItems);
    }
    return $this->tmpAllItems;

所以,我的目标是在清理 Mage_Catalog_Model_Category::CACHE_TAG 时也刷新/清理这个缓存。这怎么可能?

更新#1

当我用过

$cache = Mage::app()->getCacheInstance();

代替

$cache = Mage::app()->getCache();

清洁开始工作。当我有一个类别时,列表会刷新,但如果什么也没发生,它会保持缓存。也有人可以解释为什么这种变化会发生这种情况?

解决方案

...
$cache->save(serialize($this->tmpAllItems),$key,array('my_cache_tag'));
....

然后明确:

    $cache = Mage::app()->getCache();
    foreach($cache->getTags() as $tag){
        if(strpos($tag, 'my_cache_tag')){
            $ids = $cache->getIdsMatchingAnyTags(array($tag));
            foreach($ids as $id){
                $cache->remove($id);
            }
        }
    }
4

4 回答 4

3

我找到了解决此问题的方法,我在管理面板中单击刷新缓存时使用观察者,您可以在我的博客中查看详细信息

step1:在管理面板中单击刷新时创建带有事件的观察者:

    <events>
   <adminhtml_cache_refresh_type>
    <observers>
     <yournamespace_yourextenstion_model_observer>
      <type>singleton</type>
      <class>YourNameSpace_YourExtenstion_Model_Observer</class>
      <method>adminhtml_cache_refresh_type</method>
     </yournamespace_yourextenstion_model_observer>
    </observers>
   </adminhtml_cache_refresh_type>
  </events

现在,我们可以将文件名创建为:Observer.php 按照以下路径:YourNameSpace/YourExtenstion/Model/Observer.php 并将此代码添加到 Observer.php

这是observer.php 文件的内容

class YourNameSpace_YourExtenstion_Model_Observer
{
 public function adminhtml_cache_refresh_type($observer)
 {
  $request = Mage::app()--->getRequest()->getPost('types');
  if(in_array('ee_content', $request))
  {
   $cache = Mage::app()->getCache();
   $tags = $cache->getTags();
   $ee_content = '';
   foreach($tags as $tag)
   {
    if(strpos($tag, 'ee_content'))
    {
     $ee_content = $tag;
    }
   }
   if($ee_content !='')
   {


    $ids = $cache->getIdsMatchingAnyTags(array($ee_content));
    foreach($ids as $id)
    {
     $cache->remove($id);
    }
   }

  }
 }
} 
于 2013-11-18T04:01:56.353 回答
2

检查事件application_clean_cache

当清除缓存时 -Mage::app()->cleanCache();

或当系统保存产品等...

并查看事件 - 通过管理面板清除缓存时的adminhtml_cache_refresh_type

以及您在观察者中的代码

Mage::app()->getCache()->clean('all', array('my_tag'));

并且需要为 Observer 添加一些逻辑,以检查是否需要刷新缓存

于 2015-05-07T13:04:16.553 回答
0

您好您可以使用 Mage::dispatchEvent 方法创建自己的调度事件。覆盖您的模型文件 Mage_Catalog_Model_Category 并在那里注册一个新的调度程序。

于 2013-04-07T04:30:00.637 回答
0

getCacheInstance()将为您获取核心缓存模型实例,同时getCache()为您获取缓存对象。

getCacheInstance()要通过and清理所有内容,getCache()您需要像下面这样使用它:

Mage::app()->getCacheInstance()->flush();
Mage::app()->getCache()->clean();

要清理您的自定义缓存类型,您将使用:

Mage::app()->getCacheInstance()->cleanType('your_custom_cache_type');
于 2013-03-27T11:11:32.890 回答