В нашем приложении Symfony 3.4 есть memcache:
cache:
app: cache.adapter.memcached
default_memcached_provider: "%app.memcached.dsn%"
Тем не менее, нас попросили использовать несколько серверов кэширования, поэтому просто передать один DSN не годится.
Смотря здесь (https://symfony.com/blog/new-in-symfony-3-3-memcached-cache-adapter), Я вижу, вы можете создать его в коде так:
$client = MemcachedAdapter::createConnection(array(
// format => memcached://[user:pass@][ip|host|socket[:port]][?weight=int]
// 'weight' ranges from 0 to 100 and it's used to prioritize servers
'memcached://my.server.com:11211'
'memcached://rmf:abcdef@localhost'
'memcached://127.0.0.1?weight=50'
'memcached://username:the-password@/var/run/memcached.sock'
'memcached:///var/run/memcached.sock?weight=20'
));
Тем не менее, это не автоматическое подключение.
Я считаю, что нам нужно либо сделать класс провайдера, либо как-то заставить его делать звонки addServer($dsn)
однажды созданный. Я также видел следующее на случайных постах:
memcache:
class: Memcached
calls:
- [ addServer, [ %app.memcached.dsn.1% ]]
- [ addServer, [ %app.memcached.dsn.2% ]]
Однако это не очень помогает, или я что-то упустил.
Кто-нибудь может помочь? Как мне создать этот класс провайдера?
Вы можете скопировать приведенный выше фрагмент кода в качестве конфигурации сервиса в ваш services.yaml, который, вероятно, выглядит примерно так:
# app/config/services.yaml
services:
app.memcached_client:
class: Memcached
factory: 'Symfony\Component\Cache\Adapter\MemcachedAdapter::createConnection'
arguments: [['memcached://my.server.com:11211', 'memcached://rmf:abcdef@localhost']]
app.memcached_adapter:
class: Symfony\Component\Cache\Adapter\MemcachedAdapter
arguments:
- '@app.memcached_client'
Тогда в вашей конфигурации вы сможете ссылаться на адаптер, используя клиент, созданный на заводе, например, что-то вроде:
# app/config/config.yaml
framework:
cache:
app: app.memcached_adapter
Вы также можете перезаписать псевдоним по умолчанию. cache.adapter.memcached
вместо того, чтобы иметь свой собственный адаптер.
Ваш подход с использованием Memcached::addServer
может работать так же, но так же, как с MemcachedAdapter::createConnection
это вернет клиента, который должен быть передан кеш-адаптеру. Вот почему есть второй сервис app.memcached_adapter
, который используется в конфигурации кеша.
Пожалуйста, имейте в виду, что я не проверял это, так что это скорее грубый набросок, чем полностью рабочее решение,
Других решений пока нет …