Статьи

Создайте пользовательский адаптер кэширования в OpenCart

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

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

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

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

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

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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
namespace 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.»‘»);
    }
}

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

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

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

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

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

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

Откройте index.php под корневым каталогом вашего сайта.

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

1
$cache = new Cache(‘file’);

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

1
$cache = new Cache(database’);

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

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

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

Cache Entries

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

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

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