Создание пользовательского кэширующего адаптера в OpenCart

8 января 2018

Независимо от того, с какой веб-картой вы работаете, кеширование - важный инструмент для улучшения качества работы вашего сайта. У вас есть разные механизмы кэширования, например, файлы, APC, Memcached и многое другое. Вы можете решить, исходя из ваших требований, и иногда для обеспечения желаемого результата требуется комбинация из нескольких адаптеров.

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

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

Убедитесь, что вы установили последнюю версию OpenCart, прежде чем мы начнем создавать пользовательский адаптер.

Создать схему адаптера

Это таблица MySQL dbcache, которая собирает данные кэширования. Итак, давайте создадим его!

CREATE TABLE IF NOT EXISTS `{DB_PREFIX}dbcache` (
  `key` varchar(255) NOT NULL,
  `value` longblob NOT NULL,
  `expire` int(11) NOT NULL
) ENGINE=IoDB DEFAULT CHARSET=utf8;

Важно отметить префикс базы данных; если вы используете его, убедитесь, что вы назвали свою таблицу соответствующим образом. Например, в случае префикса базы данных oc_ вы должны создать таблицу с именем oc_dbcache.

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

Создание файла адаптера

Вы найдете все кэширующие адаптеры, предоставляемые OpenCart в каталоге library cache. Наш пользовательский адаптер также должен туда идти, поэтому давайте создадим файловую систему library cache database.php со следующим содержимым.

<?php
amespace Cache;
class Database {
    private static $_db;
    private $expire;
    /**
     * Constructor
     *
     * @param timestamp $expire Caching time in seconds
     */
    public function __construct($expire) {
        $this->expire = $expire;
        $this->initDbInstance();
    }
    /**
     * Helper method to create DB instance
     */
    private function initDbInstance() {
        if (is_null(static::$_db)) {
            static::$_db = new DB(DB_DRIVER, DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_PORT);
        }
    }
    /**
     * Fetch the value stored in cache by key
     *
     * @param string $key Cache Key
     *
     * @return mixed Value of cache key if found, boolean false otherwise 
     */
    public function get($key) {
        $query = static::$_db->query("SELECT * FROM `" . DB_PREFIX . "dbcache` WHERE `key` = '" . $key . "' AND `expire` >= '" . time() ."'");
        if ($query->num_rows) {
            return unserialize($query->row['value']);
        }
        return false;
    }
    /**
     * Set the cache value by key
     *
     * @param string $key    Cache Key
     * @param mixed  $value  Cache value
     */
    public function set($key, $value) {
        $this->delete($key);
        static::$_db->query("INSERT INTO " . DB_PREFIX . "dbcache SET `key` = '" . $key . "', `value` = '" . mysql_escape_string(serialize($value)) . "', `expire` = '" . (time() + $this->expire) . "'");
    }
    /**
     * Delete the value stored in cache by key
     *
     * @param string $key    Cache Key
     */
    public function delete($key) {
        static::$_db->query("DELETE FROM " . DB_PREFIX . "dbcache WHERE `key` = '".$key."'");
    }
}

В соответствии с соглашениями база данных классов определяется в пространстве имен Cache. Существует два свойства: $ _db и $ expire. $ _db содержит экземпляр базы данных, а $ expire устанавливается на время кеширования при создании экземпляра класса. Причина того, что свойство $ _db является статическим, - это объект singleton, который он имеет.

В конструкторе класса мы назначаем время кэширования, прошедшее из каркаса OpenCart, в свойство $ expire и вызывающее метод initDbInstance, определенный в том же классе, который создает и присваивает экземпляр базы данных $ _db, если это не так, t уже существуют.

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

Наконец, существует метод удаления, который удаляет запись из базы данных. Здесь интересно отметить, что метод set каждый раз вызывает метод delete, чтобы убедиться, что мы не создаем дубликаты записей кэша!

Итак, это касается нашей настройки файла адаптивного адаптера кэширования. В следующем разделе мы рассмотрим, как подключить его к каркасу ядра OpenCart.

Подключите наш пользовательский кеширующий адаптер

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

Идите вперед и откройте index.php под корнем документа вашего сайта.

Найдите следующий фрагмент.

$cache = new Cache('file');

Замените его:

$cache = new Cache(database');

Итак, как вы можете видеть, мы только что изменили аргумент или, скорее, имя адаптера, которое было передано при создании нового объекта $ cache.

Точно так же сделайте это для файла index.php, который находится под каталогом администратора. Он гарантирует, что как внешний, так и внешний интерфейс используют наш пользовательский адаптер кэширования.

Вы почти закончили! Переходите к нескольким страницам в интерфейсе и в интерфейсе, и вы должны увидеть, что таблица dbcache MySQL заполняется новыми записями!

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

Заключение

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

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