Автоматическое обновление кэша при обновлении продукта
Когда я обновляю продукт, кэш становится недействительным. Можно ли заставить Magento автоматически обновлять кэш при сохранении продукта?
Я попытался выполнить поиск, и результаты, которые я получил, были либо для версии до 1.8 Magento, либо пропустили некоторые подробности о том, как реализовать это:
- https://stackoverflow.com/questions/10988132/why-does-magento-invalidation-of-full-page-caching-on-product-save-actually-make
- http://inchoo.net/magento/magento-debugging/magento-how-to-fix-one-or-more-of-the-cache-types-are-invalidated-blocks-html-output-click-here-to-go-to-cache-management-and-refresh-cache-types/
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
Некоторые части этой строки очень специфичны для моей проблемы:
- Поскольку он просто обновляет недействительные кэши, я решил запускать его каждую минуту.
- setenv.sh это скрипт, который помогает мне настроить среду при работе с этим конкретным стеком bitnami.
- Чтобы получить вывод этого скрипта, я использовал эту последнюю часть ">>/var/log/cron/cron.log 2>&1" для вывода ошибок в каталог который я создал (/var/log/cron) и предоставил для него правильные разрешения.
Возможно, вам нужно изменить команду строки cron, но я думаю, что это вам поможет.
Вы могли бы написать наблюдателя для события 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;
}
}
Вы не можете просто обновить кэш, так как существует целый список записей кэша, которые необходимо заполнить.
Самым простым способом обновления было бы вызвать все URL-адреса, содержащие записи, связанные с этим, но это непродуктивно, так как это приведет к большому использованию системы.
Другим способом было бы вручную создать все записи, но это сложно из-за разного контекста, в котором они используются, например, кэширование блоков в зависимости от шаблонов, layout.xml, Идентификаторы магазинов и так далее на.Или вручную создаваемые кэши в зависимости от них. Или тайники, такие как сопутствующие товары, перекрестные продажи и так далее.
Для автоматического обновления кэша вручную просто слишком много.
Если вам нужно многое, что нуждается в кэшировании, лучшим способом было бы улучшить индекс или создать индивидуальный индекс, который лучше соответствует вашим потребностям
Вы также можете использовать другой метод для переиндексации всего блока после 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: Запустите свою домашнюю страницу и попытайтесь сохранить продукт.
Дайте мне знать, если у вас возникнут какие-либо вопросы.