我每天几次收到以下错误消息,并且我对Magento CE 1.9.0.1的内部运行情况了解得很薄,以至于我不知道这是否正常,Magento的建议行为或是否在说明我,我有一个严重的问题。
这是消息:
一种或多种缓存类型无效:阻止HTML输出。单击此处转到“缓存管理”并刷新缓存类型。
刷新特定的缓存会使问题消失几个小时左右。
我目前不编辑布局,产品等,什么都没有。
有什么问题,我该如何纠正?
我每天几次收到以下错误消息,并且我对Magento CE 1.9.0.1的内部运行情况了解得很薄,以至于我不知道这是否正常,Magento的建议行为或是否在说明我,我有一个严重的问题。
这是消息:
一种或多种缓存类型无效:阻止HTML输出。单击此处转到“缓存管理”并刷新缓存类型。
刷新特定的缓存会使问题消失几个小时左右。
我目前不编辑布局,产品等,什么都没有。
有什么问题,我该如何纠正?
Answers:
首先,重要的是要了解这不是错误,而只是一个通知。
由于产品更新,目录价格规则更改和第三方扩展,导致区块缓存失效的原因可能有很多。另外,运行cronjobs也会导致块缓存无效。
有一些社区扩展可用(在下面列出),这些扩展将在无效时刷新您的块。
https://github.com/tomasinchoo/Inchoo_InvalidatedBlockCacheFix
这是一个错误。
有一个CRON作业问题(1.9版后?)运行并导致HTML缓存失效,从而产生问题(例如,在我的情况下,未能将价格折扣延续到购物篮中-因此将向客户收取错误的金额)。
我们不需要运行扩展来解决已引入的问题!
从1.6.xx开始,这是标准的Magento操作。某些情况总是导致随机html块缓存无效。
我只是设置了一个观察者,该观察者会在定期的cron作业中触发,设置似乎合适的时间间隔。
Observer.php
<?php
/************************
* Find invalidated cache types and refresh
*
* Set Cron Time for refresh in config.xml
*
*/
class Fiasco_Rcache_Model_Observer {
public function refreshCache() {
try {
$types = Mage::app()->getCacheInstance()->getInvalidatedTypes();
foreach($types as $type) {
Mage::app()->getCacheInstance()->cleanType($type->getId());
}
Mage::log('Invalid Cache Types Refreshed');
} catch (Exception $e) {
Mage::logException($e);
}
}
}
config.xml
<?xml version="1.0"?>
<config>
<modules>
<Fiasco_Rcache>
<version>0.5.0</version>
</Fiasco_Rcache>
</modules>
<global>
<models>
<refresh_cache>
<class>Fiasco_Rcache_Model</class>
</refresh_cache>
</models>
</global>
<crontab>
<jobs>
<refresh_cache>
<!-- Min Hour Day Month DoW -->
<schedule><cron_expr>0 */3 * * *</cron_expr></schedule>
<run><model>refresh_cache/observer::refreshCache</model></run>
</refresh_cache>
</jobs>
</crontab>
</config>
此无效的缓存指示器可能与dailyCatalogUpdate cron有关。它负责应用/刷新目录规则。
每天调用一次Mage::getSingleton('catalogrule/rule')->applyAll();
。
在此方法的代码内部,有一个对的调用$this->_invalidateCache()
,该调用又$this->_app->getCacheInstance()->invalidateType()
在block_html
缓存上进行调用。
问题在于,它会使高速缓存无效,而不进行任何检查以确定它是否实际上仍然有效。对我来说,这比不使缓存无效是更好的选择,因为这样您至少可以知道它可能是无效的,并使用Fiasco Labs建议的方法来刷新(潜在地)无效的缓存数据。
然后,它决定是否要在以下方面出错:
A)向客户显示错误的价格,但保留缓存,从而减少服务器负载
要么
B)显示正确的价格,但是有更多的缓存未命中,因此服务器负载更高。
计算机科学中有两件难事:命名和缓存无效。
在这里看到解决方案:https : //magento.stackexchange.com/a/72687
基本上将功能DailyCatalogUpdate从app / code / local / Mage / CatalogRule / Model / Observer.php更改为
$collection = Mage::getResourceModel('catalogrule/rule_collection')
->addFieldToFilter('is_active', array('neq' => 0));
if ($collection->getSize() == 0) {
return $this;
}
parent::dailyCatalogUpdate($observer);
$types = Mage::getConfig()->getNode('global/catalogrule/related_cache_types')->asArray();
foreach (array_keys($types) as $type) {
Mage::app()->getCacheInstance()->cleanType($type);
}
return $this;