Redis Cache (xPDORedisCache)
        Решил попробовать использовать redis кэш для modx
создал класс xPDORedisCache, особо не заморачивался переписал мемкеш класс, но возникает проблема, идет пустая выдача и в логе:
UPD: 2016-04-10
Решение далось легко, забыл указать сериализацию
$this->redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
Устанавливается в /core/xpdo/cache/
в настройках cache_handler = cache.xPDORedisCache
Доступные опции:
redis_server — строка с данными для подключения 'localhost:6379'
redis_auth — пароль для аутентификации
redis_db — целое число >= 0
cache_prefix — по желанию, по сути если задать в redis_db разные значения для разных сайтов, будет то, что надо
Код xpdorediscache.class.php ниже:
    
    
                                                                                
            создал класс xPDORedisCache, особо не заморачивался переписал мемкеш класс, но возникает проблема, идет пустая выдача и в логе:
modExtensionPackage::loadCache() is not a valid static method.в общем логе:[Fri Apr 08 23:00:11 2016] [error] [client 130.193.37.24] PHP Warning:  Invalid argument supplied for foreach() in /var/www/core/model/modx/modcontext.class.php on line 101
[Fri Apr 08 23:00:11 2016] [error] [client 130.193.37.24] PHP Warning:  array_merge(): Argument #2 is not an array in /var/www/core/model/modx/modx.class.php on line 2306
[Fri Apr 08 23:00:11 2016] [error] [client 130.193.37.24] PHP Fatal error:  Class 'modUser_' not found in /var/www/core/xpdo/xpdo.class.php on line 770Есть какие идеи куда копать?UPD: 2016-04-10
Решение далось легко, забыл указать сериализацию
$this->redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
Устанавливается в /core/xpdo/cache/
в настройках cache_handler = cache.xPDORedisCache
Доступные опции:
redis_server — строка с данными для подключения 'localhost:6379'
redis_auth — пароль для аутентификации
redis_db — целое число >= 0
cache_prefix — по желанию, по сути если задать в redis_db разные значения для разных сайтов, будет то, что надо
Код xpdorediscache.class.php ниже:
<?php
/*
 * Copyright 2010-2014 by MODX, LLC.
 *
 * This file is part of xPDO.
 *
 * xPDO is free software; you can redistribute it and/or modify it under the
 * terms of the GNU General Public License as published by the Free Software
 * Foundation; either version 2 of the License, or (at your option) any later
 * version.
 *
 * xPDO is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * xPDO; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
 * Suite 330, Boston, MA 02111-1307 USA
 */
/**
 * Provides a redis-powered xPDOCache implementation.
 *
 * This requires the redis extension for PHP.
 *
 * @package xpdo
 * @subpackage cache
 */
class xPDORedisCache extends xPDOCache {
    protected $redis = null;
    public function __construct(& $xpdo, $options = array()) {
        parent :: __construct($xpdo, $options);
        if (class_exists('Redis', true)) {
            $this->redis= new Redis();
            if ($this->redis) {
                $server = explode(':', $this->getOption($this->key . '_redis_server', $options, $this->getOption('redis_server', $options, 'localhost:6379')));                
                if($this->redis->pconnect($server[0], (integer) $server[1])){                    
                    $redis_auth=$this->getOption('redis_auth', $options, '');
                    if(!empty($redis_auth)){
                        $this->redis->auth($redis_auth);    
                    }
                    $this->redis->select((integer)$this->getOption('redis_db', $options, 0));
                    $this->redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
                    $this->initialized = true;                        
                }   
            } else {
                $this->redis = null;
                $this->xpdo->log(xPDO::LOG_LEVEL_ERROR, "xPDORedisCache[{$this->key}]: Error creating redis provider for server(s): " . $this->getOption($this->key . '_redisd_server', $options, $this->getOption('redisd_server', $options, 'localhost:6379')));
            }
        } else {
            $this->xpdo->log(xPDO::LOG_LEVEL_ERROR, "xPDORedisCache[{$this->key}]: Error creating redis provider; xPDORedisCache requires the PHP redis extension.");
        }
    }
    public function add($key, $var, $expire= 0, $options= array()) {
        $added= false;
        if(!$this->redis->exists($this->getCacheKey($key))){          
            $added=$this->redis->set($this->getCacheKey($key),$var,$expire); 
        }
        return $added;
    }
    public function set($key, $var, $expire= 0, $options= array()) {
        $set=$this->redis->set($this->getCacheKey($key),$var,$expire); 
        return $set;
    }
    public function replace($key, $var, $expire= 0, $options= array()) {
        $replaced=false;
        if($this->redis->exists($this->getCacheKey($key))){          
            $replaced=$this->redis->set($this->getCacheKey($key),$var,$expire); 
        }
        return $replaced;
    }
    public function delete($key, $options= array()) {
        if (!isset($options['multiple_object_delete']) || empty($options['multiple_object_delete'])) {
            $deleted= $this->redis->delete($this->getCacheKey($key));
        } else {
            $deleted= $this->flush($options);
        }
        return $deleted;
    }
    public function get($key, $options= array()) {
        $value= $this->redis->get($this->getCacheKey($key));
        return $value;
    }
    public function flush($options= array()) {
        return $this->redis->flushDb();
    }
}    Комментарии: 13
                Если разберёшься, то поделись решением. Редис довольно любопытная тема            
                    
                Разобрался, полный код приложен, если будут вопросы, или вдруг не будет работать — напишите            
                    
                Круто. Спасибо. Как раз опробую на неделе            
                    
                Прирост в скорости ощутим?            
                    
                Как и любой кешер — это дает прирост скорости.            
                    
                Redis самый передовой на данный момент, на сколько я знаю. Для его работы софт нужен установленный на сервер.            
                    
                Перешел с файлового кеша на Redis. Прирост составил 24%            
                    
                А сам класс Redis где можно найти? Как работать вообще с Redis, нативной библиотеки нет у php.            
                    
                Redis клиентов для php — море. Полный список тут redis.io/clients#php выбирай любой. Код из поста написан для phpRedis.
Класс приведенный выше не работает с Redis 3.2.6. БагФикс:
                    Класс приведенный выше не работает с Redis 3.2.6. БагФикс:
public function set($key, $var, $expire = 0, $options= array()) {
        $cacheKey = $this->getCacheKey($key);
        if ($expire == 0) {
            $set = $this->redis->set($cacheKey, $var);
        } else {
            $set = $this->redis->setEx($cacheKey, $expire, $var);
        }
        return $set;
    }            
                И метод delete нужно переписать, а то если не выполняется
Багфикс
                    if (!isset($options['multiple_object_delete']) || empty($options['multiple_object_delete']))то весь кеш стирается. Любой $TV->save() и всё, нет кеша.Багфикс
public function delete($key, $options= array()) {
        $cacheKey = $this->getCacheKey($key);
        if (!isset($options['multiple_object_delete']) || empty($options['multiple_object_delete'])) {
            $deleted = $this->redis->delete($cacheKey);
        } else {
            $deletingKeys = $this->redis->keys($options['cache_key'] . '/' . $options['cache_prefix'] . '*');
            $deleted = $this->redis->delete($deletingKeys);
        }
        return $deleted;
    }            
                Приветствую! а можно чуть подробнее про 
1. опции — это $config_options в config.inc.php?
2. что туда писать?
                    1. опции — это $config_options в config.inc.php?
2. что туда писать?
                Добрый день. Подскажите как настроить redis от beget при включении дает это session.save_handler = beget session.save_path = tcp://127.0.0.1:6380 куда что вписывать не пойму. Или может на платной основе кто настроит? Спасибо.            
                    
                привет. удалось разобраться?            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.