Как очистить кэширование Magento своей схемы DB?

#caching #magento

#кэширование #magento

Вопрос:

Я разрабатываю расширение Magento, которое вводит новую таблицу в БД. Всякий раз, когда я выпускаю новую версию расширения, которое вносит изменения в схему таблицы, я обнаруживаю, что пользователи вынуждены вручную нажимать кнопку «Очистить хранилище кэша» в разделе Система> Управление кэшем.

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

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

Обновление: Я нашел файл, содержащий кэш схемы моей таблицы, здесь: /var/cache/mage-f/mage---d07_DB_PDO_MYSQL_DDL_<table_name>_1d . Теперь, как мне настроить его таргетинг в коде? 🙂

Комментарии:

1. Обычно требуется обновление кэша. Как вы выполняете изменения?

2. Я был удивлен этим, а также тем, что я не видел этого в предыдущей версии моего расширения. Вот что у меня есть в моем сценарии обновления: $installer = $this; $installer->startSetup(); $installer->run(" ALTER TABLE '{$this->getTable('my_table')}' ADD COLUMN 'columnX' INT(11) NULL, ADD COLUMN 'columnY' VARCHAR(45) NULL, ADD COLUMN 'columnZ' VARCHAR(45) NULL, ADD COLUMN 'columnW' text NULL AFTER 'columnA'; "); $installer->endSetup(); Делаю ли я что-нибудь необычное?

Ответ №1:

Это то, что я смог придумать:

 $app = Mage::app();
if ($app != null)
{
    $cache = $app->getCache();
    if ($cache != null)
    {
        $cache->clean('matchingTag', array('DB_PDO_MYSQL_DDL'));
    }
}
  

При этом будут удалены только записи кэша и файлы метаданных, которые содержат информацию о схемах БД.

Обратите внимание, что эти записи будут удалены для всех таблиц. Не существует простого способа очистить кэшированную схему конкретной таблицы и оставить остальные нетронутыми.