在Symfony中创建一个Cache Provider类

时间:2018-10-29 14:55:21

标签: php symfony caching memcached autowired

我们在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% ]]

但是它并没有真正的帮助,或者我错过了一些东西。

有人可以帮忙吗?如何创建此提供程序类?

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