Статьи

Понимать кеширование в OpenCart

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

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

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

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

Поэтому вам нужно что-то промежуточное, что ускоряет процесс, и именно здесь кеширование входит в картину. Идея кэширования очень проста: вы сохраняете вычисленные / отформатированные результаты где-то и извлекаете их при необходимости, чтобы вам не пришлось делать это снова. Это «где-то» может быть где угодно: файловая система, память или сама база данных.

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

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

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

Библиотека кэширования предоставляется в самом ядре, поэтому давайте сразу же рассмотрим ее. Откройте файл system/library/cache.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
<?php
class Cache {
    private $cache;
 
    public function __construct($driver, $expire = 3600) {
        $class = ‘Cache\\’ .
 
        if (class_exists($class)) {
            $this->cache = new $class($expire);
        } else {
            exit(‘Error: Could not load cache driver ‘ . $driver . ‘ cache!’);
        }
    }
 
    public function get($key) {
        return $this->cache->get($key);
    }
 
    public function set($key, $value) {
        return $this->cache->set($key, $value);
    }
 
    public function delete($key) {
        return $this->cache->delete($key);
    }
}

Начиная с конструктора, он инициализирует драйвер кеша, переданный в аргументе конструктора. Если класс доступен для запрошенного адаптера кэширования, он будет инициализирован в свойстве $this->cache , в противном случае он завершится с сообщением об ошибке. Мы увидим различные адаптеры кэширования в следующем разделе.

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

Метод get используется для извлечения значения из кэша.

1
$this->cache->get($key);

Метод set используется для хранения значения в кеше.

1
$this->cache->set($key, $value);

Метод delete используется для удаления сопоставления ключ / значение из кэша.

1
$this->cache->delete($key);

Поэтому очень просто использовать функции кэширования и в ваших модулях.

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

  • новейшие продукты
  • бестселлер
  • список производителей
  • список стран
  • список валют
  • список зон
  • настройки магазина

В случае кеширования файлов вы найдете все файлы кеша, хранящиеся в каталоге system/cache . Хотя OpenCart очищает кэш при соответствующих событиях, вы также можете очистить эти файлы вручную, чтобы получить последние данные.

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

В ядре OpenCart есть три адаптера кэширования — file, memcache и apc. Адаптер кэширования по умолчанию, используемый в OpenCart, — это файл.

Вот фрагмент из index.php который инициализирует объект $cache с помощью адаптера кэширования по умолчанию.

1
2
3
// Cache
$cache = new Cache(‘file’);
$registry->set(‘cache’, $cache);

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

Поскольку реализация каждого адаптера кэширования практически одинакова, мы рассмотрим только один из адаптеров кэширования, чтобы увидеть, что происходит. Давайте возьмем memcache, например. Идите вперед и откройте system/library/cache/mem.php . Вы также можете изучить два других адаптера file.php и apc.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
<?php
namespace Cache;
class Mem {
    private $expire;
    private $cache;
 
    public function __construct($expire) {
        $this->expire = $expire;
 
        $this->cache = new \Memcache();
        $this->cache->pconnect(CACHE_HOSTNAME, CACHE_PORT);
    }
 
    public function get($key) {
        return $this->cache->get(CACHE_PREFIX . $key);
    }
 
    public function set($key,$value) {
        return $this->cache->set(CACHE_PREFIX . $key, $value, MEMCACHE_COMPRESSED, $this->expire);
    }
 
    public function delete($key) {
        $this->cache->delete(CACHE_PREFIX . $key);
    }
}

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

Вспомните те методы, которые мы обсуждали в последнем разделе — они на самом деле заканчиваются здесь. Поэтому, когда вы вызываете метод get в классе Cache , он фактически вызывает метод get определенный в фактическом классе адаптера — в нашем случае это класс Mem .

Фактическая логика манипулирования записями в кэше происходит в методах класса адаптера. Как видите, в конструкторе класса Mem мы инициализировали объект Memcache и установили соединение с pconnect метода pconnect . Наконец, мы используем методы get, set и delete объекта Memcache для манипулирования записями в кэше.

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

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

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

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

Не стесняйтесь выражать свои мысли в форме запросов и предложений, используя канал ниже.