Types de bloc invalides

9

Je reçois le message d'erreur suivant plusieurs fois par jour, et ma connaissance du fonctionnement interne de Magento CE 1.9.0.1 est suffisamment fine pour que je ne sache pas si c'est un comportement normal et consultatif de Magento, ou s'il est révélateur. moi j'ai un mauvais problème.

Voici le message:

Un ou plusieurs types de cache sont invalidés: bloque la sortie HTML. Cliquez ici pour accéder à la gestion du cache et actualiser les types de cache.

L'actualisation de ce cache particulier fait disparaître le problème pendant quelques heures.

Je n'édite actuellement pas de mises en page, de produits, etc., rien du tout.

Qu'est-ce qui ne va pas et comment puis-je le corriger?

Dave G
la source
Je l'obtiens tous les jours lorsque je me réveille et que je me connecte sur Magento v1.9.2.2 - Un ou plusieurs types de cache sont invalidés: bloque la sortie HTML. Cliquez ici pour accéder à la gestion du cache et actualiser les types de cache. Je n'ai jamais utilisé cela sur les versions antérieures à moins que je ne fasse quelque chose. Est-ce une sorte de bug?
Neal Hart

Réponses:

6

Tout d'abord, il est important de comprendre qu'il ne s'agit pas d'une erreur, mais simplement d'une notification.

Il peut y avoir une multitude de raisons pour lesquelles un cache de bloc est invalidé par les mises à jour des produits, les modifications des règles de prix du catalogue et les extensions tierces. L'exécution de cronjobs peut également invalider les caches de bloc.

Il existe des extensions de communauté disponibles (répertoriées ci-dessous) qui actualiseront vos blocs à mesure qu'ils seront invalidés.

https://github.com/tomasinchoo/Inchoo_InvalidatedBlockCacheFix

https://github.com/mklooss/Loewenstark_InvalidCache

Eirik
la source
2

C'EST une erreur.

Il existe un problème de travail CRON (post 1.9.?) Qui exécute et invalide le cache HTML, ce qui génère des problèmes (par exemple, dans mon cas, n'a pas pu reporter la remise de prix dans le panier - donc un client se verrait facturer un montant incorrect).

Nous ne devrions pas avoir besoin d'exécuter une extension pour résoudre un problème qui a été introduit!

Brian Milnes
la source
J'obtiens exactement le même comportement sur CE 1.9.2.2, chaque matin, la sortie HTML des blocs doit être actualisée et j'ai pensé à un problème de tâche cron. @Brian pourriez-vous donner plus de détails sur cette tâche cron?
Marc
Je pense que vous pensez cependant à l'envers: ce n'est pas que le "prix n'a pas été reporté dans le panier", mais plutôt que le prix sur la page a été ajouté au cache avant la mise à jour, et donc le cache était incorrect , tandis que le prix correct indiqué dans le panier. Pour l'acheteur, cependant, ils pensent probablement que le prix le plus bas est le "bon".
Eric Seastrand
@Brian, pourriez-vous donner plus de détails sur la tâche cron qui a invalidé vos blocs?
Haim
0

Il s'agit d'une opération Magento standard à partir de 1.6.xx et plus. Quelque chose provoque toujours une invalidation aléatoire du cache de bloc html.

Je viens de mettre en place un observateur qui se déclenche sur une tâche périodique cron, définir tout intervalle semble approprié.

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>
Fiasco Labs
la source
0

Cet indicateur de cache invalidé est probablement lié au cron dailyCatalogUpdate. Il est responsable de l'application / l'actualisation des règles de catalogue.

Une fois par jour, il appelle Mage::getSingleton('catalogrule/rule')->applyAll();.

Dans le code de cette méthode, il y a un appel à $this->_invalidateCache(), qui à son tour appelle $this->_app->getCacheInstance()->invalidateType()le block_htmlcache.

Le problème est qu'il invalide le cache sans effectuer aucune vérification pour déterminer s'il peut toujours être valide. Pour moi, cela vaut mieux que de ne pas invalider le cache, car alors vous pouvez au moins savoir qu'il pourrait être invalide et utiliser quelque chose comme ce que Fiasco Labs a suggéré pour vider les données mises en cache (potentiellement) invalides.

Il s'agit alors de décider si vous voulez faire une erreur du côté de:

A) Montrer aux clients le mauvais prix, mais garder le cache et donc avoir moins de charge sur le serveur

ou

B) Montrant le prix correct, mais ayant plus de ratés de cache, et donc une charge de serveur plus élevée.

Il y a deux choses difficiles en informatique: nommer les choses et invalider le cache .

Eric Seastrand
la source
0

voir ici la solution: https://magento.stackexchange.com/a/72687

Modifiez fondamentalement la fonction dailyCatalogUpdate de app / code / local / Mage / CatalogRule / Model / Observer.php en

        $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;
MeHigh
la source