Magento (How to fix): One or more of the Cache Types are invalidated: Blocks HTML output.

Some time has passed since I wrote original version of this article, Magento was at 1.5. these days…
Now, almost 2 years later I have decided to revamp the article since lot’s of feedback is gathered…
For that purpose, I have wrote small extension for it that you can find here:
https://github.com/tomasinchoo/Inchoo_InvalidatedBlockCacheFix/tags
I would like to thank all of you, especially people that gave suggestions in order to improve it.
Main difference is that it is done through observer and the code is wrapped up in extension for easier use.
Keep in mind that this extension is created for purposes of blog article at inchoo.net and as such can only be used as proof of concept. If you find it helpful in order to learn Magento, that is great, but be careful if you plan to use it in production environment even though I do 🙂
Some sites can’t afford to clean block cache on every product edit, so please keep that in mind.
Thanks, and looking forward to your feedback!
83 comments
Beside I respect this side and I got some valuable information in the past:
This approach to the problem is very funny, it is like your wife cheat on you and your solution is to give her a shower.
If you are saving one product and you have to refresh all the cache because of that, this is not a solution because you are wasting 90% of the cache for just 1 product:
– If the cache is invalidated it means it will not be used till you refresh it.
– if you refresh it you loose all the previous cache stored (because refresh in magento means delete )
A serious approach would be:
– to find out why the whole cache is invalidated when you save a product ? ( this is for sure a core bug )
– fix this behavior so that only the cache related to the product you saved is invalidated/refreshed.
This is what I would call a solution, not hide the alarm and reset the whole thing every time.
Thanks for comment. You are right. Yet, this article is like 7 years old. Before Magento version mentioned in article, Magento didn’t invalidate cache at all (at product save) even though it should have. This is not a bug at all. This is merely notification about current state of Magento cache. That being said… At that point we were working on daily deal sites (you probably remember those). and this was requirement (yes, we used only 1 product active at any given time). Article was created just as proof of concept.(as it was mentioned), and hence the notice that some sites can’t afford clearing the cache on every product save. My bad I didn’t state the obvious: “It clears block cache, maybe it is not good idea for everyone”. 🙂 Anyway, there are people using this so I couldn’t just delete it, but I’ll go check it and see if I can make it more clear on github what is it all about…
“I have decided to revamp the article” means you’re going to post a link to the module code? What happened to the original article? I’d like to actually learn about the issue and how you went about deciding how to solve it.
Hi guys, Is it works on magento 1.9. Actually I didn’t get the importance of this notification
Any chance of getting your extension updated to work with Magento EE ver. 1.13.0.2 ?
Any chance we can see an update for 1.8.1.0? Annoyingly this issue still exists.
I’m seeing that the cache is refreshed properly, but for some reason the warning is still appearing, even with the content up to date. Is this happening for anyone else or is it just me?
Hi Dave, this is happening for me too on 1.9.0.1. Did you find anything out? This is the behaviour I see:
When triggered by event controller_action_postdispatch_adminhtml_catalog_product_save in adminhtml scope (i.e. manual product save in admin interface) then the cache is cleaned and the warning disappears.
When triggered by event catalog_product_save_commit_after in global scope, the cache appears to be get cleaned but the warning persists. I need to use this because our products are updated by API.
When triggered by a cron job, the cache appears to be cleaned but the warning persists. I tried this as a workaround.
I’ve dug around the core code a lot and I can’t figure a reason why this behaviour is happening.
Terrific work! That is the type of info that should be shared around the internet.
Shame on Google for now not positioning this post upper!
Come on
over and consult with my website . Thank you
=)
Works fine on 1.7.0.2, but in Magento 1.8 the problem is back and your fix don’t work correct.
Nice, but what if we use Full Page Cache on our http://www.shopmages.com site ? We often get the HTML invalidation – and all the time we need to refresh full cache, and run full page crawler for whole site. Can it be avoid ?
Thank you – works like a charm in Magento 1.7.0.2.
Thanks Thomas it works great for Magento 1.7.0.2
Hm… weird… that’s part of initial commit … I’m not sure how did you ended up there 🙂
This is latest version in zip:
https://github.com/tomasinchoo/Inchoo_InvalidatedBlockCacheFix/archive/1.0.0.zip
Please try it by extracting it to your site root directory. It should work.
tanks for reply. I read it in this file:
README.md
at
https://github.com/tomasinchoo/Inchoo_InvalidatedBlockCacheFix/blob/1f84dd39a8291a84c4fe21f2ae0ab7abf77be947/README.md
anyway thanks
@Fulvio … Hm… where exactly did you read that it works only for US?
https://github.com/tomasinchoo/Inchoo_InvalidatedBlockCacheFix/blob/master/README.md
Maybe you read that one on this (OTHER) extension: https://github.com/tomasinchoo/Inchoo_USDisableRegions
Well, in that case I’m afraid you should try some other extension like this one: http://www.magentocommerce.com/magento-connect/remove-or-change-displayed-states-and-regions-1964.html
My version was created as part of the project on which client had no interest in shipping to any other country than USA so that save us some time and some cost to the client 😉
Hi Tomas i tried to install your app but it gave me some problem, you write in the README file:
” ….It works only for US….. ”
why only for US they look better than european or oceanian african etc… ? 😉
@darren You mean tutorial for copy-paste? Please check my previous comment: “@Casper – Just unpack it and copy to your site’s root directory…”
Tomas, is there any tutorial that I can follow to install this extension?
@Casper – Just unpack it and copy to your site’s root directory…
I am pretty new with Magento. How do I even “install” this extension?
Thanks so much in advance!
We are a gaggle of volunteers and starting a new scheme in our community.
Your site provided us with helpful info to work on.
You’ve done a formidable job and our whole community might be thankful to you.
I’ve worte a Extension for this Issues.
https://github.com/mklooss/Loewenstark_InvalidCache
There just do the same, but i had add also a CronJob to check if one of the caches are invalid and clean this type.
bacause the cache will be invalid, when u save Catalog Rules or each other settings:
https://github.com/mklooss/Loewenstark_InvalidCache/blob/master/app/code/community/Loewenstark/InvalidCache/Model/Observer.php
Fantastic goods from you, man. I have understand
your stuff previous to and you’re just extremely excellent. I really like what you have acquired here, certainly like what you’re saying and the way in which you say it.
You make it enjoyable and you still care for to keep it sensible.
I can’t wait to read far more from you. This is really a terrific website.
Thanks for sharing such a good thought, piece of writing is pleasant, thats why i have read it entirely
Thank you for sharing superb informations. Your website is very cool.
I’m impressed by the details that you have on this web site. It reveals how nicely you
understand this subject. Bookmarked this website page, will come back for extra articles.
You, my pal, ROCK! I found just the information I already searched all over the place
and simply could not come across. What an ideal website.
Hi Robert,
Well… you are right … singleton is not needed since if you don’t specify otherwise, you will always get singleton 🙂
Already created this little extension myself, a few differences, I made a yes/no enable feature for the backend, in yours you have singleton inside the observer where as mine does not.
Why should this be needed?
Rob.
@Alex I could have added it, however, it is ALWAYS invalidated, even if you save product with no NEW data, however I don’t see what can it break, so I will add it as soon as possible 🙂 Thanks for feedback!
Why dont you check at least if cache is invalidated before flushing it? Something like
$invalidateTypes = Mage::app()->getCacheInstance()->getInvalidatedTypes();
if (!empty($invalidateTypes[‘block_html’])) {…
Hi everyone, I would just like to inform you that there is revamped version of this article if you are interested! 😉
works like anything thanks a lot
@Lewis
Not really. Magento Cron runs on my server but the cache block still gets invalid. (1.7.0.2)
Fix from travis worked fine. Thanks!
This message is caused because you haven’t set up your
Magento cron. This fix is completely unnecessary, just follow these
instructions –
http://www.magentocommerce.com/wiki/1_-_installation_and_configuration/how_to_setup_a_cron_job.
Hi I have this problem whit html block invalidate, but all
the documentation and bug error I found is about Magento 1.5 my
solution is 1.7.0.2 and think I’m the only one whit this problem
whit the 1.7 Any suggestion?
I am using EE 1.12.0.2 and get this message for full page cache also. How can I add this cache to the refresh also?
Travis i have magento CE 1.7.0.2 and it´s work fine thanks so much my friend.
this solve issue when you save product in admin, what about product update on frontend?
i mean if you sell product, QTY would decrease (1st change) and if you run out of stock, product will not be salable (2nd change) and might want to hide it from some blocks.
so rather than hacking core files, better solution would be to have an observer on product change and reset the cache than.
thoughts?
I got the same error in 1.7.0.2
before experimenting, i looked at one of Travis’ last few comments.
Here’s what worked for me:
Select all > Disable Cache
Select all > Enable Cache
selecting that individual item and re-enabling wont help.
I am running Magento 1.7.0.1. I followed @Travis instructions and it works great. Remember to recompile if your using it.
I got the same error message:
Fatal error: Call to a member function getCollection() on a non-object in …..code/core/Mage/CatalogRule/Model/Observer.php on line 49.
I disabled my module in System-Configuration-Advanced
but it did not change anything. Same error on product save
Also there are no files under var/report…
Also tried to comment out all lines in my Rule.php – same error
Any ideas?
Travis, i have two questions! First…. why is this an problem in magento for many years and never solved? and the seccond question why nobody write an patch… so everybody can solved the problem easy! I use version 1.6.2 and many times if people talk about go to directory … i can’t find the dir coz it isn’t there. My problem is when i add a product i can not saved the short en long description! block-html cash fault. I hope you will help me.
regards Ronald
It could be a permissions issue – are you sure all files are readable/executable?
Travis, the code is same as you have posted. No change at all.
Cicilia, perhaps post your code. Also, you could try disabling any other 3rd party extensions you have installed.
Thanks for your patience guys – I’ve just been super slammed busy lately. I do have an implementation of the workflow I discussed before. I’m doing a little further testing on it, and then it should be online! Hopefully before the end of the week…
Yes commented out every line in Rule.php and also tried with blank class but still error exists. Is there some tag missing in config.xml for 1.6.2 (that’s my guess only)?
You’ll have to find which line is causing the error. Presumably it’s in Rule.php. Go through and comment out all the lines and re-enable one by one to find the culprit.
Hi, I implemented it on CE 1.6.2 and getting error exactly as told by Rick. Also, Travis, there is no error report generated for that. Any further suggestions?
Hi Rick, I think you need to trace back the error further. Look in /var/report for the file that relates to the error number being shown. Post the contents or relevant part of the error report.
I implemented exactly this (last post of Travis) on 1.6.2 but I get a Fatal error: Call to a member function getCollection() on a non-object in /home/rick/domains/website/public_html/app/code/core/Mage/CatalogRule/Model/Observer.php on line 49. Any ideas?
@Travis
Great! It works for me too.
SOLVED – As a follow up to the above post:
I disabled all the caches and tested again. I then received the debug message in the log file – meaning the extension was firing properly.
I then re-enabled the caches, and everything seems to be working properly.
Hi, I am trying this on CE 1.6.0 and can’t seem to get it to fire.
Step 1) Create /app/etc/modules/Emerge_Cacherefresh.xml
Step 2: Create /app/code/local/Emerge/Cacherefresh/etc/config.xml
Step 3: Create /app/code/local/Emerge/Cacherefresh/Model/Rule.php
Notice that I have included the Mage::log function to show a debug line.
All permissions on the files are 777.
The warning message still appears:
One or more of the Cache Types are invalidated: Blocks HTML output. Click here to go to Cache Management and refresh cache types.
And, my debug message is not show in /var/log/system.log
If I use the DebugToolbar on the front-end, I can see that my “Emerge_Cacherefresh” is being loaded.
I don’t know how else to check whether it’s working. Could anyone please advise?
Can someone implement this change for me for a small fee? I moved Magento to new server and can’t fix this issue? Thanks.
I just wanna get a notification when Mark posts his cron job 😉
You would need to override the crontab settings (most likely with xml), and then override the error/warning message value set for this cron action in a custom module. This is screaming custom extension! I’ll let you know when I have one.. maybe I can whip something up over the next couple days in my free time.
I agree with you, Mark. Refreshing cache on every product update is not a good idea. Do you have any idea on how to change the runtime of that cron event, and/or to hide that annoying message?
I think rather than refreshing the cache on every product save, the better alternative is to just remove this notification message, even though the block cache is outdated. While it is considered ‘outdated’, I don’t believe that having a slightly outdated block html warrants an intrusive adminhtml notification message. If you were that concerned and had a lot of product saves and still want to reap the benefits of the cache (and not see that notification message), I would suggest to hide that message and then lower the default runtime of that cron event.
Hi,
I am using Magento ver. 1.6.2.0. having above problem.
I am new to programming. Could you please tell the exact location of the config.xml file. I searched this file found in many location. Kindly help me to resolved this issue.
Thanks is advace
Jagadeesh
I know this fix is to be implemented at the Admin level but if I have Admin and frontend on separate servers, do I need to apply this fix on frontend as well?
thanks a lot, another life saver post, found this post when we were facing this problem.
Is there any reason why you wouldnt want to refresh the cache types automatically?
@Adrien: every 86400 seconds -> once per day
Someone on the Magento forums (I don’t remember where) told me that caches are configured for being refreshed every X hours.
I like the idea of Toni as he said it doesn’t overwrite anything.
But to be honest, if you have several people working in the catalog backend and/or you have a high traffic website, doing a clean of the HTML Block too often is not a good idea. Between display conflict and page loading, you will have some unhappy customers.
@Ruslan I hope you have been able to find the resolution so for, but if not here it is, you would have to declare your models path explicitly in your global node.
in your case it should be some thing like this
BTW, Vinai, you are a sniper 🙂 as your suggestion about issue with reindexAll() is absolutely right.
We have found it after the February release too and fixed it. The fix was available starting from Magento 1.6 alpha, and will be included in the soon-coming Magento 1.6 stable release.
Good idea to get rid of that annoying message. Here’s an alternative that doesn’t rewrite the core model (i.e. using events) https://gist.github.com/1074482
-Toni
Maybe you got confused with my reply on Inchoo’s forum, because I omitted the complete config file:
<config>
<modules>
<Fix_FixBlockCacheInvalidated>
<version>0.1.0</version>
</Fix_FixBlockCacheInvalidated>
</modules>
<global>
<models>
<catalogrule>
<rewrite>
<rule>Sioseo_FixBlockCacheInvalidated_Model_Rule</rule>
</rewrite>
</catalogrule>
</models>
</global>
</config>
Hope that helps,
Adrian
I’m New to coding… How do i create a file called Rule.php in my module Model directory?
Where exactly do i place the
,
any where in my config.xml?
I’m New to coding… How do i create a file called Rule.php in my module Model directory?
Where exactly do i place the
Yourpackage_Yourmodule_Model_Rule
,
any where in my config.xml?
Maybe someone can tell me what I’m doing wrong.
app/etc/modules/Fix_FixBlockCacheInvalidated.xml
app/code/local/Fix/FixBlockCacheInvalidated/etc/config.xml
app/code/local/Fix/FixBlockCacheInvalidated/Model/Rule.php
Thanks!
Well….unless there is something I don’t know, you will have COMPLETELY cleared block html cache when you save product from admin. How much impact will it have on caching utilisation is depending on how often you are adding /editing product.
OK, I’ve fixed the config.xml file:
<global>
<models>
<catalogrule>
<rewrite>
<rule>Sioseo_FixBlockCacheInvalidated_Model_Rule</rule>
</rewrite>
</catalogrule>
</models>
</global>
Now, the message about the invalidation doesn’t show anymore, and I see my debug message at the log file, so my code is executing.
How can I make sure it’s working ok? What was the sympthom, apart from the cache warning?
Cheers,
Adrian
Hi Adrian, you should have put that xml into MODELS section of your config XML… sorry, my bad I wasn’t clear enough. I’ll update article as soon as possible,
(sorry for forgetting to htmlencode the xml tags)
Hi, Tomas.
I’ve followed your advice and it doesn’t seem to be called when I modify a product’s description, just to fire the cache invalidation.
Here’s what I did:
app/etc/modules/Sioseo_FixBlockCacheInvalidated.xml:
<config>
<modules>
<Sioseo_FixBlockCacheInvalidated>
<active>true</active>
<codePool>local</codePool>
</Sioseo_FixBlockCacheInvalidated>
</modules>
</config>
app/code/local/Sioseo/FixBlockCacheInvalidated/etc/config.xml:
<config>
<modules>
<Sioseo_FixBlockCacheInvalidated>
<version>0.1.0</version>
</Sioseo_FixBlockCacheInvalidated>
</modules>
<catalogrule>
<rewrite>
<rule>Sioseo_FixBlockCacheInvalidated_Model_Rule</rule>
</rewrite>
</catalogrule>
</config>
app/code/local/Sioseo/FixBlockCacheInvalidated/Model/Rule.php:
class Sioseo_FixBlockCacheInvalidated_Model_Rule extends Mage_CatalogRule_Model_Rule
{
public function applyAllRulesToProduct($product)
{
$this->_getResource()->applyAllRulesForDateRange(NULL, NULL, $product);
$this->_invalidateCache();
//APLATTE 20110527 – Refrescar la caché de bloque HTML
Mage::app()->getCacheInstance()->cleanType(‘block_html’);
Mage::log(‘Caché de bloques HTML refrescado desde Sioseo_FixBlockCacheInvalidated_Model_Rule.applyAllRulesToProduct’);
$indexProcess = Mage::getSingleton(‘index/indexer’)->getProcessByCode(‘catalog_product_price’);
if ($indexProcess) {
$indexProcess->reindexAll();
}
}
}
Cache still gets invalidated, and my log comment doesn’t show on the log.
Thanks,
Adrian
Hi, Tomas.
I’ve followed your advice and it doesn’t seem to be called when I modify a product’s description, just to fire the cache invalidation.
Here’s what I did:
app/etc/modules/Sioseo_FixBlockCacheInvalidated.xml:
true
local
app/code/local/Sioseo/FixBlockCacheInvalidated/etc/config.xml:
0.1.0
Sioseo_FixBlockCacheInvalidated_Model_Rule
app/code/local/Sioseo/FixBlockCacheInvalidated/Model/Rule.php:
class Sioseo_FixBlockCacheInvalidated_Model_Rule extends Mage_CatalogRule_Model_Rule
{
/**
* Apply all price rules to product
*
* @param int|Mage_Catalog_Model_Product $product
* @return Mage_CatalogRule_Model_Rule
*/
public function applyAllRulesToProduct($product)
{
$this->_getResource()->applyAllRulesForDateRange(NULL, NULL, $product);
$this->_invalidateCache();
//APLATTE 20110527 – Refrescar la caché de bloque HTML
Mage::app()->getCacheInstance()->cleanType(‘block_html’);
Mage::log(‘Caché de bloques HTML refrescado desde Sioseo_FixBlockCacheInvalidated_Model_Rule.applyAllRulesToProduct’);
$indexProcess = Mage::getSingleton(‘index/indexer’)->getProcessByCode(‘catalog_product_price’);
if ($indexProcess) {
$indexProcess->reindexAll();
}
}
}
Cache still gets invalidated, and my log comment doesn’t show on the log.
Thanks,
Adrian
Sure, I just wanted to correct my previous post 🙂
Thanks 🙂
@Vinai Thanks for info about indexing even though for this particular situation (invalidated cache) I guess only block_html cache refresh solves the problem. 😉
Ah, I see. Hmm, I would believe reindexing a single product should be enough, but probably you are right.
Also, the method reindexProductIds() is only available on the indexerProcess Resource model, so to correct my previous post, here is how to reindex a single product properly:
Mage::getSingleton(‘index/indexer’)->processEntityAction($product, Mage_Catalog_Model_Product::ENTITY, Mage_Index_Model_Event::TYPE_SAVE);
@Vinai
Only thing I did with this rewrite is this this line:
Mage::app()->getCacheInstance()->cleanType(‘block_html’);
Anyway… I didn’t took time to check what’s under the hood in $indexProcess object, I just assumed that Magento guys have their reasons for calling reindexAll 🙂
Good find!
But wouldn’t
$indexProcess->reindexProductIds($product->getId())
be enough instead of doing
$indexProcess->reindexAll();
?
Vinai