Недействительные типы блоков

9

Я получаю следующее сообщение об ошибке несколько раз в день, и мои знания о внутренней работе Magento CE 1.9.0.1 достаточно тонкие, поэтому я не знаю, является ли это нормальным, консультативным поведением от Magento или оно говорит У меня плохая проблема.

Вот сообщение:

Один или несколько типов кэша признаны недействительными: блокирует вывод HTML. Нажмите здесь, чтобы перейти к управлению кэшем и обновить типы кэша.

Обновление этого конкретного кеша устраняет проблему на пару часов или около того.

Я сейчас не редактирую макеты, продукты и т. Д., Вообще ничего.

Что не так и как я могу это исправить?

Дэйв Дж
источник
Я получаю это каждый день, когда просыпаюсь и вхожу в Magento v1.9.2.2 - один или несколько типов кэша признаны недействительными: блокирует вывод HTML. Нажмите здесь, чтобы перейти к управлению кэшем и обновить типы кэша. Я никогда не использовал это в более ранних версиях, если я на самом деле не делал что-то. Это какая-то ошибка?
Нил Харт,

Ответы:

6

Во-первых, важно понимать, что это не ошибка, это просто уведомление.

Может быть множество причин, по которым кеш блоков становится недействительным из-за обновлений продуктов, изменений правил цены каталога и сторонних расширений. Также запуск cronjobs может привести к тому, что блочные кэши также станут недействительными.

Доступны некоторые расширения сообщества (перечислены ниже), которые обновят ваши блоки по мере того, как они станут недействительными.

https://github.com/tomasinchoo/Inchoo_InvalidatedBlockCacheFix

https://github.com/mklooss/Loewenstark_InvalidCache

Эйрик
источник
2

Это ошибка.

Существует проблема задания CRON (публикация 1.9.?), Которая запускает и делает недействительным HTML-кэш, что приводит к проблемам (например, в моем случае не удалось перенести скидку на цену в корзину - поэтому с клиента будет взиматься неправильная сумма).

Нам не нужно запускать расширение, чтобы исправить возникшую проблему!

Брайан Милнс
источник
Я получаю точно такое же поведение на CE 1.9.2.2, каждое утро необходимо обновить блок HTML-кода и подумать о проблеме с заданием cron. @ Брайан, не могли бы вы рассказать подробнее об этой задаче cron?
Марк
Я думаю, что вы думаете задом наперед: это было не из-за того, что «цена не перенесена в корзину», а из-за того, что цена на странице была добавлена ​​в кеш перед выполнением обновления, и, следовательно, кеш был неверным , при этом правильная цена указана в корзине. Для покупателя, однако, они, вероятно, думают, что какая бы цена ни была "правильной".
Эрик Сизранд
@Brian, не могли бы вы рассказать подробнее о задаче cron, которая делала ваши блоки недействительными?
Хаим
0

Это стандартная операция Magento с 1.6.xx и выше. Что-то всегда вызывает случайную аннулирование 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>
Fiasco Labs
источник
0

Этот недействительный индикатор кэша, вероятно, связан с cron dailyCatalogUpdate. Он отвечает за применение / обновление правил каталога.

Раз в день звонит Mage::getSingleton('catalogrule/rule')->applyAll();.

Внутри кода этого метода есть вызов $this->_invalidateCache(), который , в свою очередь , вызывает $this->_app->getCacheInstance()->invalidateType()на block_htmlкэш.

Проблема заключается в том, что он делает кэш недействительным без каких-либо проверок, чтобы определить, действительно ли он все еще действителен. Для меня это лучше, чем не делать недействительной кэш-память, потому что тогда вы можете, по крайней мере, знать, что она может быть недействительной, и использовать что-то вроде того, что Fiasco Labs предложила очистить (потенциально) недействительные кэшированные данные.

Затем принимается решение о том, хотите ли вы допустить ошибку на стороне:

А) Показывать клиентам неправильную цену, но сохранять кеш и, таким образом, иметь меньшую нагрузку на сервер

или

B) Отображение правильной цены, но с большим количеством ошибок кэша и, следовательно, более высокой нагрузкой на сервер.

В компьютерной науке есть две сложные вещи: именование вещей и аннулирование кэша .

Эрик Систранд
источник
0

Смотрите здесь решение: 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;
MeHigh
источник