Доктрина подключения к редису с паролем

1

Звучит просто, но это заставило меня ходить целыми часами.

Как подключиться к серверу redis cache с помощью пароля. Он соединяет и кэширует доктринные запросы успешно без пароля, но когда я помещаю пароль, он выдает исключение

InvalidConfigurationException in ArrayNode.php line 309:
Unrecognized option "password" under "doctrine.orm.entity_managers.default.query_cache_driver"

Я попробовал комбинацию, но мой текущий код - config.yml.....

    entity_managers:
        default:
            metadata_cache_driver: apc
            query_cache_driver:
                type: redis
                host: localhost
                port: 6379
#                password: myStr0nG!passw0rd - adding this causes exception
                instance_class: Redis
            result_cache_driver:
                type: redis
                host: localhost
                port: 6379
#                password: myStr0nG!passw0rd - adding this causes exception
                instance_class: Redis
  • 0
    Эй, Дон Омонди, не могли бы вы сказать мне, пожалуйста, драйвер - лучший массив данных, redis, apc memcache ??
Теги:
caching
redis
doctrine2

3 ответа

5
Лучший ответ

вы не можете установить пароль для драйвера кэша, поскольку он не поддерживается.

Если вы хотите использовать альтернативу, подумайте об использовании SncRedisBundle

Пример конфигурации

snc_redis:
    clients:
        cache:
            type: predis
            alias: default
            dsn: redis://secret@localhost/1
            logging: %kernel.debug%
    doctrine:
        metadata_cache:
            client: cache
            entity_manager: default          # the name of your entity_manager connection
            document_manager: default        # the name of your document_manager connection
        result_cache:
            client: cache
            entity_manager: [default, read]  # you may specify multiple entity_managers
        query_cache:
            client: cache
            entity_manager: default
  • 1
    И github.com/doctrine/DoctrineCacheBundle/blob/master/… вот почему вы не можете установить пароль.
  • 0
    @Vamsi Спасибо за ваш ответ. Я смотрел на этот пакет ранее, но не хотел его поднимать, потому что он включал в себя изменение кода моего контроллера, что усложняло бы переключение с redis на memcached или что-либо другое. Я думаю, у меня нет выбора сейчас.
Показать ещё 3 комментария
2

Чтобы использовать пароль без пакета Snc, просто используйте запись doctrine_cache:

Добавить DoctrineCacheBundle в AppKernel:

$bundles = [
    ...
    new Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle(),
    ...
];

config.yml

doctrine_cache:
    providers:
        my_provider:
            redis:
                host: hostname
                port: 6379
                password: foobared
doctrine:
    orm:
        metadata_cache_driver:
            type: service
            id: doctrine_cache.providers.my_provider
1

Я решил эту проблему так же, как и рогериолино.

Вот часть конфигурации, относящаяся к текущей проблеме:

config.yml

doctrine:
    dbal:
        driver:   pdo_mysql
        host:     "%database_host%"
        port:     "%database_port%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
        charset:  UTF8
    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true
        result_cache_driver:
          type: service
          id: "app.my_redis"
        metadata_cache_driver:
          type: service
          id: "app.my_redis"
        query_cache_driver:
          type: service
          id: "app.my_redis"

service.yml

services:
    app.my_redis:
        class: AppBundle\Utils\Cache\MyRedis

Класс обслуживания:

namespace AppBundle\Utils\Cache;
use Doctrine\Common\Cache\Cache;
use Doctrine\Common\Cache\RedisCache;


class MyRedis extends RedisCache
{
    private $password = 'some string you like but that passes';
    private $host = "some ip address";
    private $port = 6379;
    private $timeout = 0.0;
    private $dbNumber = 1;
    private $dbMap = [
        'local.windows.domain',
        'production.domain',
        'staging.domain',
    ];

    /**
     * MyRedis constructor.
     */
    public function __construct()
    {
        $redis = new \Redis;
        $redis->connect($this->host, $this->port, $this->timeout);
        $redis->auth($this->password);
        // This way of $_SERVER checking could be solved better.
        $redis->select(array_search($_SERVER['HTTP_HOST'], $this->dbMap));
        $this->setRedis($redis);
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню