OpenCart и Redis

Начал осваивать для общего развития популярную 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';

На данном этапе все приготовления выполнены, сессии и кэш хранятся в оперативной памяти, что обеспечивает максимальную скорость считывания к «горячим» данным.

OpenCart и Redis: 12 комментариев

    1. Боюсь что я не проверял и с данной мажорной веткой не работал.
      Это все я проделывал на третьей (opencart 3), последний на текущей момент ветки.

  1. Не завелось. В админку входит, но сессию в 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

    1. Если бы сессии не писались куда либо, то было бы не зайти в админку. Скорее всего механизм хранения не изменился

  2. У меня не заработало на чистом ocStore 3.0.2.0 и на OpenCart 3.0.3.2. Пробывал на хостинге и на Open Server в связке с Nginx + PHP-FPM 7.2/7.0 и Redis (3 разные версии).

    1. Правда, не работают только сессии. Не пойму что не правильного в вашем коде?

      1. мой код взят с сайта на котором работает, скорее всего что то с настройками ПО. В логах при этом что нибудь есть?

  3. При входе создается сессия в redis, и через несколько секунд удаляется из redis.
    Делал всё по инструкции.

    1. Скорее всего проблема в $this->expire и там очень маленькое значение. Поправил статью

      1. Коллеги, здравствуйте.

        Почему-то Redis не кэширует категории с большим количеством товаров.
        OcStore 3.0.2.0

        Не подскажите, всё сделал по инструкции

        Заранее большое спасибо за помощь.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *