升级magento到1.5之后,后台Cache Storage Management那里好像出现了一点小问题,基本上每次将Blocks HTML output改为enabled之后,第二天又会是invalidated(我这里因为cron每天都会执行catalogrule),或者每次在后台任意点开某个product,然后再save,Blocks HTML output也会从enabled变为invalidated,google了一下,很多人好像都遇到了这个问题,类似于One or more of the Cache Types are invalidated: Blocks HTML output. Click here to go to Cache Management and refresh cache types.这样的提示。
通过看源码之后发现,这个bug似乎又不像是个bug,为什么呢?看catalogrule的config.xml,里面有段
<catalogrule>
<related_cache_types>
<block_html/>
</related_cache_types>
</catalogrule>
我们发现,和catalogrule关联的cache块是block_html,我说的cache块是指进后台Cache Storage Management,Associated Tags对应的值,只不过后台是大写的。
当我们进入后台product编辑页,即便什么也不做,点save,经过层层触发,会进入CatalogRule/Model/Rule.php,看function applyAllRulesToProduct,有$this->_invalidateCache()这么一句,再进入function _invalidateCache,code如下:
protected function _invalidateCache()
{
$types = Mage::getConfig()->getNode(self::XML_NODE_RELATED_CACHE);
if ($types) {
$types = $types->asArray();
Mage::app()->getCacheInstance()->invalidateType(array_keys($types));
}
return $this;
}
$types = Mage::getConfig()->getNode(self::XML_NODE_RELATED_CACHE)这一句替换完宏就是
$types = Mage::getConfig()->getNode('global/catalogrule/related_cache_types'),看最上面的config.xml,$types最终得到的值是block_html,所以下面的invalidateType就将block_html设为了invalidated。
这里我也很迷惑,不知道magento的用意是什么?貌似1.4版本不会出现这个问题。
相关解决方法及讨论 http://www.magentocommerce.com/boards/viewthread/219407/