hosting:cms:opencart:redis

2.13.4.19. Настройка Redis в OpenCart

Чтобы включить поддержку Redis в OpenCart 3.0, выполните следующее:

  1. В конце каждого из двух конфигурационных файлов — config.php и admin/config.php — добавьте такой код (в строке с параметром CACHE_HOSTNAME вместо example подставьте название хостинг-аккаунта, в котором размещён сайт):
    // CACHE
    define('CACHE_HOSTNAME', '/home/example/.system/redis.sock');
    define('CACHE_PORT', 0);
    define('CACHE_PREFIX', 'oc_');

  2. В файле system/library/cache/redis.php:
    1. Найдите такую строку:

      $this->cache->setTimeout(CACHE_PREFIX . $key, $this->expire);

      И замените в ней setTimeout на expire, чтобы она приняла такой вид:

      $this->cache->expire(CACHE_PREFIX . $key, $this->expire);

    2. Найдите такую строку:

      $this->cache->delete(CACHE_PREFIX . $key);

      И замените в ней delete на del, чтобы она приняла такой вид:

      $this->cache->del(CACHE_PREFIX . $key);

  3. В файле system/config/default.php найдите такой блок кода:

    // Cache
    $_['cache_engine'] = 'file'; // apc, file, mem or memcached
    $_['cache_expire'] = 3600;

    И в строке с параметром cache_engine замените file на redis, чтобы этот блок принял такой вид:

    // Cache
    $_['cache_engine'] = 'redis'; // apc, file, mem or memcached
    $_['cache_expire'] = 3600;

  4. Проверьте работу сайта.

Чтобы включить поддержку Redis в OpenCart 2.2/2.3, выполните следующее:

  1. В конце каждого из двух конфигурационных файлов — config.php и admin/config.php — добавьте такой код (в строке с параметром CACHE_HOSTNAME вместо example подставьте название хостинг-аккаунта, в котором размещён сайт):
    // CACHE
    define('CACHE_HOSTNAME', '/home/example/.system/redis.sock');
    define('CACHE_PORT', 0);
    define('CACHE_PREFIX', 'oc_');

  2. В каталоге system/library/cache создайте файл redis.php с таким содержимым:

    <?php
    namespace Cache;
    class Redis {
    	private $expire;
    	private $cache;
    	public function __construct($expire) {
    		$this->expire = $expire;
    		$this->cache = new \Redis();
    		$this->cache->pconnect(CACHE_HOSTNAME, CACHE_PORT);
    	}
    	public function get($key) {
    		$data = $this->cache->get(CACHE_PREFIX . $key);
    		return json_decode($data, true);
    	}
    	public function set($key, $value) {
    		$status = $this->cache->set(CACHE_PREFIX . $key, json_encode($value));
    		if ($status) {
    			$this->cache->expire(CACHE_PREFIX . $key, $this->expire);
    		}
    		return $status;
    	}
    	public function delete($key) {
    		$this->cache->delete(CACHE_PREFIX . $key);
    	}
    }

  3. В файле system/config/default.php найдите такой блок кода:

    // Cache
    $_['cache_engine'] = 'file'; // apc, file, mem or memcached
    $_['cache_expire'] = 3600;

    И в строке с параметром cache_engine замените file на redis, чтобы этот блок принял такой вид:

    // Cache
    $_['cache_engine'] = 'redis'; // apc, file, mem or memcached
    $_['cache_expire'] = 3600;

  4. Проверьте работу сайта.

Чтобы включить поддержку Redis в OpenCart 2.0/2.1, выполните следующее:

  1. В конце каждого из двух конфигурационных файлов — config.php и admin/config.php — добавьте такой код (в строке с параметром CACHE_HOSTNAME вместо example подставьте название хостинг-аккаунта, в котором размещён сайт):
    // CACHE
    define('CACHE_HOSTNAME', '/home/example/.system/redis.sock');
    define('CACHE_PORT', 0);
    define('CACHE_PREFIX', 'oc_');

  2. В каталоге system/library/cache создайте файл redis.php с таким содержимым:

    <?php
    namespace Cache;
    class Redis {
    	private $expire;
    	private $cache;
    	public function __construct($expire) {
    		$this->expire = $expire;
    		$this->cache = new \Redis();
    		$this->cache->pconnect(CACHE_HOSTNAME, CACHE_PORT);
    	}
    	public function get($key) {
    		$data = $this->cache->get(CACHE_PREFIX . $key);
    		return json_decode($data, true);
    	}
    	public function set($key, $value) {
    		$status = $this->cache->set(CACHE_PREFIX . $key, json_encode($value));
    		if ($status) {
    			$this->cache->expire(CACHE_PREFIX . $key, $this->expire);
    		}
    		return $status;
    	}
    	public function delete($key) {
    		$this->cache->delete(CACHE_PREFIX . $key);
    	}
    }

  3. В каждом из двух индексных файлов — index.php и admin/index.php — найдите такой блок кода:

    // Cache
    $cache = new Cache('file');
    $registry->set('cache', $cache);

    И в строке с параметром $cache замените file на redis, чтобы этот блок принял такой вид:

    // Cache
    $cache = new Cache('redis');
    $registry->set('cache', $cache);

  4. Проверьте работу сайта.

Чтобы включить поддержку Redis в OpenCart 1.5, выполните следующее:

  1. В конце каждого из двух конфигурационных файлов — config.php и admin/config.php — добавьте такой код (в строке с параметром REDIS_HOSTNAME вместо example подставьте название хостинг-аккаунта, в котором размещён сайт):
    // CACHE
    define('CACHE_DRIVER', 'redis');
    define('REDIS_HOSTNAME', '/home/example/.system/redis.sock');
    define('REDIS_PORT', '0');

  2. Замените содержимое файла system/library/cache.php на такое1):

    <?php
    final class Cache
    {
        private $expire = 3600;
        private $serialize_type = 'json';
        private $cache_mode = 'redis';
        public function __construct()
        {
            $this->site_key = substr(md5(HTTP_SERVER), 0, 5);
            $this->redis = new Redis();
            if (!$this->redis->connect(REDIS_HOSTNAME, REDIS_PORT)) {
                $this->cache_mode = 'file';
            }
        }
        public function getCacheMode()
        {
            return $this->cache_mode;
        }
        public function setCacheMode($cache_mode = 'redis')
        {
            $this->cache_mode = $cache_mode;
        }
        public function setSerializeType($serialize_type = 'serialize')
        {
            $this->serialize_type = $serialize_type;
        }
        public function getSerializeType()
        {
            return $this->serialize_type;
        }
        public function get($key)
        {
            if ($this->cache_mode == 'redis') {
                $cache = $this->redis->get($key . '.' . $this->site_key);
            } else {
                $files = glob(DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.*');
                if ($files) {
                    $cache = file_get_contents($files[0]);
                    foreach ($files as $file) {
                        $time = substr(strrchr($file, '.'), 1);
                        if ($time < time()) {
                            if (file_exists($file)) {
                                unlink($file);
                            }
                        }
                    }
                }
            }
            if ($this->serialize_type == 'json') {
                $data = json_decode($cache, true);
            } else {
                $data = unserialize($cache);
            }
            return $data;
        }
        public function set($key, $value, $expire = 0)
        {
            if ($expire == 0) {
                $expire = rand($this->expire, $this->expire + 400);
            }
            if ($this->cache_mode == 'redis') {
                $res = $this->redis->set($key . '.' . $this->site_key, json_encode($value), $expire);
            } else {
                $this->remove($key);
                $file = DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.' . (time() + $expire);
                $handle = fopen($file, 'w');
                if ($this->serialize_type == 'json') {
                    $data = json_encode($value);
                } else {
                    $data = serialize($value);
                }
                fwrite($handle, $data);
                fclose($handle);
            }
        }
        public function delete($key)
        {
            if ($this->cache_mode == 'redis') {
                $this->redis->delete($key . '.' . $this->site_key);
            } else {
                $files = glob(DIR_CACHE . 'cache.' . preg_replace('/[^A-Z0-9\._-]/i', '', $key) . '.*');
                if ($files) {
                    foreach ($files as $file) {
                        if (file_exists($file)) {
                            unlink($file);
                            clearstatcache();
                        }
                    }
                }
            }
        }
    }

  3. Проверьте работу сайта.


1)
Код драйвера взят из этого репозитория.
  • hosting/cms/opencart/redis.txt
  • Последние изменения: 2019/11/15 12:08
  • — karlov