Начал осваивать для общего развития популярную CMS opencart и решил сразу внести некоторые действия по оптимизации производительности системы. Я взял третью ветку за основу и я хотел положить кэш и сессии в redis.
Хостинг я выбрал beget, в связи с тем, что он один из лучших хостеров России, а так же из коробки поддерживает Redis сервер (включается в сервисах панели управления).
С кэшем мне повезло, третья версия умеет это из коробки, достаточно прописать нужные настройки, для этого нужно прописать константы в config.php и admin/config.php:
// redis define('CACHE_HOSTNAME', '127.0.0.1'); define('CACHE_PORT', '6379'); define('CACHE_PREFIX', 'ocredis_');
И в настройках по умолчанию system/config/default.php указать движок для кэша
// Cache $_['cache_engine'] = 'redis'; // apc, file, mem or memcached
С сессиями оказалось чуть сложнее, так как механизм сессий у opencart свой и настройка в php никак не влияет на неё. По умолчанию админка хранит сессии в файлах, фронт часть хранит в БД и эти 2 драйвера доступны, но нам надо в redis.
Для этого был написан простенький класс system/library/session/redis.php:
<?php /** * Author: Shabalin Pavel */ namespace Session; final class Redis { public $expire = ''; protected $prefix = 'sess_'; public function __construct($registry) { $this->redis = new \Redis(); if (!$this->redis->pconnect('127.0.0.1')) { throw new \Exception("Permissions denied session storage"); } $this->expire = ini_get('session.gc_maxlifetime'); } public function read($session_id) { if ($this->redis->exists($this->prefix . $session_id)) { return json_decode( $this->redis->get($this->prefix . $session_id), true ); } return false; } public function write($session_id, $data) { if ($session_id) { $this->redis->psetex($this->prefix . $session_id, $this->expire * 1000, json_encode($data)); } return true; } public function destroy($session_id) { if ($this->redis->exists($this->prefix . $session_id)) { $this->redis->delete($this->prefix . $session_id); } return true; } public function gc($expire) { return true; } }
И поменять настройки для фронт и бэк части system/config/catalog.php и system/config/admin.php:
// Session $_['session_engine'] = 'redis';
На данном этапе все приготовления выполнены, сессии и кэш хранятся в оперативной памяти, что обеспечивает максимальную скорость считывания к «горячим» данным.
Здравствуйте.
Будет ли данная инструкция рабочей для 1.5.6.4?
Боюсь что я не проверял и с данной мажорной веткой не работал.
Это все я проделывал на третьей (opencart 3), последний на текущей момент ветки.
Вы б ище настройку Redis выклали было б здорово)
Не завелось. В админку входит, но сессию в redis не записывает.
Хотя обычные все пишет:
1) «oc_stock_status.1»
2) «oc_seopro.keywords»
3) «oc_category.all.1.0»
4) «oc_seopro.cat_tree»
5) «oc_tax_class»
6) «oc_weight_class.1»
7) «oc_cmsblock.1»
8) «oc_admin.language»
9) «oc_zone.176»
10) «oc_store»
11) «oc_country.admin»
12) «oc_manufacturer.0.1»
13) «oc_currency»
14) «oc_catalog.language»
15) «oc_order_status.1»
16) «oc_length_class.1»
17) «oc_seopro.queries»
18) «oc_voucher_theme.1»
19) «oc_seopro.product_categories»
Версия ocStore 3.0.2.0
php 7.2
Если бы сессии не писались куда либо, то было бы не зайти в админку. Скорее всего механизм хранения не изменился
У меня не заработало на чистом ocStore 3.0.2.0 и на OpenCart 3.0.3.2. Пробывал на хостинге и на Open Server в связке с Nginx + PHP-FPM 7.2/7.0 и Redis (3 разные версии).
Правда, не работают только сессии. Не пойму что не правильного в вашем коде?
мой код взят с сайта на котором работает, скорее всего что то с настройками ПО. В логах при этом что нибудь есть?
При входе создается сессия в redis, и через несколько секунд удаляется из redis.
Делал всё по инструкции.
Скорее всего проблема в $this->expire и там очень маленькое значение. Поправил статью
Коллеги, здравствуйте.
Почему-то Redis не кэширует категории с большим количеством товаров.
OcStore 3.0.2.0
Не подскажите, всё сделал по инструкции
Заранее большое спасибо за помощь.
Это, скорее всего, никак не связано, проблему нужно искать в чем то другом. Вы как то посмотрели что в кэше нет данных и именно зависит от размера категории?