我们在Symfony 3.4应用中具有内存缓存:
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% ]]
但是它并没有真正的帮助,或者我错过了一些东西。
有人可以帮忙吗?如何创建此提供程序类?
答案 0 :(得分: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
的原因。
请注意,我尚未对此进行测试,因此,这只是一个粗略的概述,而不是一个完整的解决方案,
答案 1 :(得分:0)
对于我的运行Symfony 3.4的项目之一,配置更为简单:
创建将用作客户端的服务:
app.memcached_client:
class: Memcached
factory: ['AppBundle\Services\Memcached', 'createConnection']
arguments: ['memcached://%memcache_ip%:%memcache_port%']
AppBundle\Services\Memcached
可以具有我需要的所有自定义逻辑,如下所示:
class Memcached
{
public static function createConnection($dns)
{
$options = [
'persistent_id' => 'some id'
];
// Some more custom logic. Maybe adding some custom options
// For example for AWS Elasticache
if (defined('Memcached::OPT_CLIENT_MODE') && defined('Memcached::DYNAMIC_CLIENT_MODE')) {
$options['CLIENT_MODE'] = \Memcached::DYNAMIC_CLIENT_MODE;
}
return \Symfony\Component\Cache\Adapter\MemcachedAdapter::createConnection($dns, $options);
}
}
然后我在config.yml中使用了该服务:
framework:
cache:
default_memcached_provider: app.memcached_client