От автора: неважно в каком фреймворке вы работаете, кэширование – важный инструмент улучшения общей производительности сайта, который полезно иметь при себе. Механизмы кэширования бывают разные: файловое, APC, Memcached и т.д. Вы можете выбрать подходящий способ, исходя из требований. Иногда для достижения желанного результата необходимо использовать несколько адаптеров.
В OpenCart кэширование происходит с помощью нескольких, уже встроенных в ядро, адаптеров. Их можно использовать в качестве шаблона для создания кастомного адаптера. Для создания кастомного адаптера необходимо создать методы на контракт и подключить свою логику в них, и все! Новый адаптер будет автоматически подхватываться, как часть механизма кэширования OpenCart.
Во всех адаптерах кэширования реализован базовый механизм хранения и получения измененных данных. Точно так же будет работать наш кастомный адаптер кэширования базы данных. Именно поэтому нам необходимо создать кастомную схему для хранения кэшированных данных.
Установите последнюю версию OpenCart, прежде чем приступить к созданию кастомного адаптера.
Создание схемы адаптера
Наши кэшированные данные будут храниться в 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.
В остальном структура таблицы довольно проста. В ней всего три столбца — key, value и expire. В колонке key хранится ключ кэширования, в колонке value – соответствующее значение. Колонка expire хранит слепок времени UNIX.
Создание файла адаптера
Все адаптеры кэширования OpenCart лежат в папке system\library\cache. Там должен располагаться и наш кастомный адаптер. Создадим файл system\library\cache\database.php со следующим кодом.
1 2 3 4 5 6 7 8 9 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 объявлено статичным потому, что оно хранит объект вида singleton.
В конструкторе класса мы устанавливаем время кэширования, которое передается из OpenCart в свойство $expire и вызывает метод initDbInstance, определенный в том же классе, который создает и присваивает объект базы данных свойству $_db, если объект ранее не создан.
Далее метод get получает запись кэша по ключу и времени устаревания, а метод set вставляет новую запись о кэшировании в базу данных. Кроме того, в методе set мы создаем серию кэша для правильного хранения. В методе get перед возвращением значения необходимо проводить десериализацию.
И наконец, есть метод delete, удаляющий записи из базы данных. Интересно отметить, что метод set вызывает delete каждый раз, чтобы проверить таблица на дубликаты!
С созданием файла адаптера кэширования закончили. В следующем разделе мы узнаем, как его подключить в ядро OpenCart.
Подключение кастомного адаптера кэширования
К сожалению, у адаптера нет back end части, с помощью которой его можно было бы подключить. Поэтому в рамках этого урока мы подключим его напрямую в ядро.
Откройте файл index.php в корне сайта. Найдите код.
1 |
$cache = new Cache('file'); |
Замените на:
1 |
$cache = new Cache(database'); |
Как видите, мы просто заменили аргумент, или, скорее, название адаптера, передаваемого при создании объекта $cache.
То же самое сделайте в файле index.php в папке admin. После этого front end и back end будут использовать наш кастомный адаптер кэширования.
Почти закончили! Откройте пару страниц на front end и back end. Таблица dbcache должна быть заполнена новыми записями!
Точно так же можно создать адаптер кэширования и для других движков хранения. Несмотря на простоту примера в этом уроке, думаю, что концепция будет важна для вашего кастомного адаптера.
Заключение
Сегодня мы обсудили, как создать кастомный адаптер кэширования в OpenCart. В процессе демонстрации был создан адаптер кэширования базы данных.
Автор: Sajal Soni
Источник: //code.tutsplus.com/
Редакция: Команда webformyself.