Звучит просто, но это заставило меня ходить целыми часами.
Как подключиться к серверу 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
вы не можете установить пароль для драйвера кэша, поскольку он не поддерживается.
Если вы хотите использовать альтернативу, подумайте об использовании 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
Чтобы использовать пароль без пакета 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
Я решил эту проблему так же, как и рогериолино.
Вот часть конфигурации, относящаяся к текущей проблеме:
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);
}
}