2.13.4.19. Налаштування Redis в OpenCart

Процес настройки Redis відрізняється в різних версіях OpenCart.

  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. Перевірте роботу сайту.
  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_type'] = 'file'; // apc, file, mem or memcached
    $_['cache_expire'] = 3600;

    І в рядку з параметром cache_engine замініть file на redis, Щоб цей блок прийняв такий вигляд:

    // Cache
    $_['cache_type'] = 'redis'; // apc, file, mem or memcached
    $_['cache_expire'] = 3600;
  4. Перевірте роботу сайту.
  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. Перевірте роботу сайту.
  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 на таке (код драйвера узятий звідси):
    <?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. Перевірте роботу сайту.
Зміст