Автоматическое обновление кэша при обновлении продукта


Когда я обновляю продукт, кэш становится недействительным. Можно ли заставить Magento автоматически обновлять кэш при сохранении продукта?

Я попытался выполнить поиск, и результаты, которые я получил, были либо для версии до 1.8 Magento, либо пропустили некоторые подробности о том, как реализовать это:

Author: Community, 2014-11-10

4 answers

Я использую стек Bitnami Magento, для меня это решение ниже было лучшим, которое я нашел.

Я пытался создать php-файл Mage_Shell_Class, но безуспешно (недопустимый массив кэша всегда был пуст при запуске, несмотря ни на что, и я действительно не представляю, почему).

Я создал php-файл'sample.php ':

<?php

require 'app/Mage.php';

$invalid = Mage::app()->getCacheInstance()->getInvalidatedTypes();

foreach($invalid as $i)
{
    Mage::app()->getCacheInstance()->cleanType($i["id"]);
}

Я поместил его в корневую папку magento, и для его запуска я использую cronjob, который работает под пользователем root.

Итак, чтобы создать cronjob в корне пользователь:

sudo crontab -u root -e

И это была моя командная строка для ее запуска:

* * * * * . /opt/bitnami/scripts/setenv.sh ; /opt/bitnami/php/bin/php /opt/bitnami/apps/magento/htdocs/sample.php >> /var/log/cron/cron.log 2>&1

Некоторые части этой строки очень специфичны для моей проблемы:

  1. Поскольку он просто обновляет недействительные кэши, я решил запускать его каждую минуту.
  2. setenv.sh это скрипт, который помогает мне настроить среду при работе с этим конкретным стеком bitnami.
  3. Чтобы получить вывод этого скрипта, я использовал эту последнюю часть ">>/var/log/cron/cron.log 2>&1" для вывода ошибок в каталог который я создал (/var/log/cron) и предоставил для него правильные разрешения.

Возможно, вам нужно изменить команду строки cron, но я думаю, что это вам поможет.

 2
Author: Wagner Bertolini Junior, 2017-01-10 20:29:19

Вы могли бы написать наблюдателя для события catalog_product_save_after. Это будет выглядеть примерно так, как показано ниже, очистка любого кэша, который вы хотите обновить

class [Namespace]_[Module]_Model_Observer
{
    public function clearCache($observer)
    {
        foreach (array('block_html','collections','fpc') as $type) // or any type of cache you want to invalidate
        {
            Mage::app()->getCacheInstance()->cleanType($type);
            Mage::dispatchEvent('adminhtml_cache_refresh_type', array('type' => $type));
        }

        return $this;
    }
}
 1
Author: Sander Mangel, 2014-11-10 16:35:42

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

Самым простым способом обновления было бы вызвать все URL-адреса, содержащие записи, связанные с этим, но это непродуктивно, так как это приведет к большому использованию системы.

Другим способом было бы вручную создать все записи, но это сложно из-за разного контекста, в котором они используются, например, кэширование блоков в зависимости от шаблонов, layout.xml, Идентификаторы магазинов и так далее на.Или вручную создаваемые кэши в зависимости от них. Или тайники, такие как сопутствующие товары, перекрестные продажи и так далее.

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

Если вам нужно многое, что нуждается в кэшировании, лучшим способом было бы улучшить индекс или создать индивидуальный индекс, который лучше соответствует вашим потребностям

 0
Author: Flyingmana, 2014-11-10 20:06:10

Вы также можете использовать другой метод для переиндексации всего блока после saving product. Создайте наблюдателя catalog_product_save_after, следуя приведенному ниже коду.

Шаг 1: Поместите файл конфигурации в app\etc\modules\Keyul_UpdateAllChache.xml.xml и поместите приведенный ниже код.

<?xml version="1.0"?>
<config>
  <modules>
    <Keyul_UpdateAllChache>
      <active>true</active>
      <codePool>local</codePool>
      <version>0.1.0</version>
    </Keyul_UpdateAllChache>
  </modules>
</config>

Шаг 2: Создайте структуру модуля в виде следующих папок.

Приложение\код\локальный\Ключ\Updateallchache\и т. Д.

Приложение\код\локальный\Ключ\Updateallchache\Модель

Шаг 3: Создайте config.xml файл в app\code\local\Keyul\UpdateAllChache\etc\config.xml и поместите ниже код.

<?xml version="1.0"?>
<config>
    <modules>
        <Keyul_UpdateAllChache>
            <version>0.1.0</version>
        </Keyul_UpdateAllChache>
    </modules>
<global>    
    <models>
        <updateallchache>
            <class>Keyul_UpdateAllChache_Model</class>
            <resourceModel>updateallchache_mysql4</resourceModel>
        </updateallchache>
    </models>
    <events>
        <catalog_product_save_after> <!-- identifier of the event we want to catch -->
            <observers>
                <catalog_product_save_after_handler> <!-- identifier of the event handler -->
                    <type>model</type> <!-- class method call type; valid are model, object and singleton -->
                    <class>updateallchache/observer</class> <!-- observers class alias -->
                    <method>updateAll</method>  <!-- observer's method to be called -->
                    <args></args> <!-- additional arguments passed to observer -->
                </catalog_product_save_after_handler>
            </observers>
        </catalog_product_save_after>
    </events>
</global>
</config> 

Шаг 4: Создайте Observer.php файл в app\code\local\Keyul\UpdateAllChache\Model\Observer.php и поместите приведенный ниже код.

<?php
class Keyul_UpdateAllChache_Model_Observer
{

        public function updateAll(Varien_Event_Observer $observer)
        {
            Mage::app()->cleanCache();
        }
    
}

Шаг 5: Запустите свою домашнюю страницу и попытайтесь сохранить продукт.

Дайте мне знать, если у вас возникнут какие-либо вопросы.

 0
Author: Keyul Shah, 2020-06-15 08:30:17