Tipos de bloque invalidados

9

Recibo el siguiente mensaje de error varias veces al día, y mi conocimiento del funcionamiento interno de Magento CE 1.9.0.1 es lo suficientemente escaso que no sé si esto es normal, el comportamiento de asesoramiento de Magento, o si es revelador Yo tengo un mal problema.

Aquí está el mensaje:

Uno o más de los tipos de caché están invalidados: bloquea la salida HTML. Haga clic aquí para ir a Administración de caché y actualizar los tipos de caché.

Actualizar ese caché en particular hace que el problema desaparezca por un par de horas más o menos.

Actualmente no estoy editando diseños, productos, etc., nada en absoluto.

¿Qué está mal y cómo puedo corregirlo?

Dave G
fuente
Recibo esto todos los días cuando me levanto e inicio sesión en Magento v1.9.2.2 - Uno o más de los tipos de caché están invalidados: bloquea la salida HTML. Haga clic aquí para ir a Administración de caché y actualizar los tipos de caché. Nunca solía obtener esto en versiones anteriores a menos que realmente estuviera haciendo algo. ¿Es esto algún tipo de error?
Neal Hart

Respuestas:

6

Primero, es importante entender que esto no es un error, es simplemente una notificación.

Puede haber innumerables razones por las que un bloque de caché se invalida por actualizaciones de productos, cambios en las reglas de precios de catálogo y extensiones de terceros. La ejecución de cronjobs también puede hacer que los cachés de bloque se invaliden también.

Hay algunas extensiones de comunidad disponibles (enumeradas a continuación) que actualizarán sus bloques a medida que se invaliden.

https://github.com/tomasinchoo/Inchoo_InvalidatedBlockCacheFix

https://github.com/mklooss/Loewenstark_InvalidCache

Eirik
fuente
2

Esto es un error.

Hay un problema de trabajo de CRON (post 1.9.?) Que ejecuta e invalida la caché HTML, lo que produce problemas (por ejemplo, en mi caso, no se pudo transferir el descuento de precio a la cesta, por lo que se cobraría al cliente una cantidad incorrecta).

¡No deberíamos necesitar ejecutar una extensión para solucionar un problema que se ha introducido!

Brian Milnes
fuente
Estoy obteniendo exactamente el mismo comportamiento en CE 1.9.2.2, todas las mañanas La salida HTML de Blocks debe actualizarse, y pensé en un problema de trabajo cron. @Brian, ¿podrías dar más detalles sobre esa tarea cron?
Marc
Sin embargo, creo que está pensando al revés: no era que el "precio no se transfiriera a la cesta", sino que el precio en la página se agregó al caché antes de que se ejecutara la actualización y, por lo tanto, el caché era incorrecto , mientras que el precio correcto se muestra en el carrito. Sin embargo, para el comprador, probablemente piensen que el precio más bajo es el "correcto".
Eric Seastrand
@Brian, ¿podrías dar más detalles sobre la tarea cron que estaba invalidando tus bloques?
Haim
0

Esta es la operación estándar de Magento desde 1.6.xx en adelante. Siempre hay algo que causa una invalidación aleatoria de la caché del bloque html.

Acabo de configurar un observador que se dispara en un trabajo cron periódico, establezco cualquier intervalo que parezca apropiado.

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>
Laboratorios Fiasco
fuente
0

Este indicador de caché invalidado probablemente esté relacionado con el cron DailyCatalogUpdate. Es responsable de aplicar / actualizar las reglas del catálogo.

Una vez al día, llama Mage::getSingleton('catalogrule/rule')->applyAll();.

Dentro del código de este método, hay una llamada a $this->_invalidateCache(), que a su vez llama $this->_app->getCacheInstance()->invalidateType()a la block_htmlmemoria caché.

El problema es que invalida el caché sin hacer ninguna verificación para determinar si aún podría ser válido. Para mí, esto es mejor que no invalidar el caché, porque entonces al menos puede saber que podría ser inválido, y usar algo como lo que Fiasco Labs sugirió para vaciar los datos (potencialmente) no almacenados en caché.

Luego se convierte en una decisión sobre si desea un error en el lado de:

A) Mostrar a los clientes el precio incorrecto, pero mantener el caché y, por lo tanto, tener menos carga del servidor

o

B) Muestra el precio correcto, pero tiene más errores de caché y, por lo tanto, una mayor carga del servidor.

Hay dos cosas difíciles en informática: nombrar cosas e invalidar la memoria caché .

Eric Seastrand
fuente
0

Vea aquí la solución: https://magento.stackexchange.com/a/72687

Básicamente cambie la función dailyCatalogUpdate de app / code / local / Mage / CatalogRule / Model / Observer.php a

        $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;
Yo alto
fuente