在 Symfony 中创建一个 Cache Provider 类

del*_*8uk 2 php memcached caching autowired symfony

我们的 Symfony 3.4 应用程序上有 memcache:

cache:
    app: cache.adapter.memcached
    default_memcached_provider: "%app.memcached.dsn%"
Run Code Online (Sandbox Code Playgroud)

然而,我们被要求使用多个缓存服务器,因此仅传递一个 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'
)); 
Run Code Online (Sandbox Code Playgroud)

但是,这不是自动连接的。

我相信我们需要创建一个提供程序类,或者以某种方式让它addServer($dsn)在实例化后进行调用。我还在随机帖子中看到以下内容:

memcache:
    class: Memcached
    calls:
        - [ addServer, [ %app.memcached.dsn.1% ]]
        - [ addServer, [ %app.memcached.dsn.2% ]]
Run Code Online (Sandbox Code Playgroud)

然而它并没有真正帮助或者我错过了一些东西。

有人可以帮忙吗?我如何创建这个提供者类?

dbr*_*ann 5

您可以将上面的代码片段作为服务配置复制到 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'
Run Code Online (Sandbox Code Playgroud)

然后在您的配置中,您应该能够使用工厂创建的客户端来引用适配器,例如:

# app/config/config.yaml

framework:
    cache:
        app: app.memcached_adapter
Run Code Online (Sandbox Code Playgroud)

您也许还可以覆盖默认别名,cache.adapter.memcached而不用拥有自己的适配器。

您使用的方法Memcached::addServer可能也有效,但就像这样MemcachedAdapter::createConnection将返回客户端,该客户端需要传递给缓存适配器。这就是为什么有第二个服务app.memcached_adapter,它用于缓存配置。

请注意,我还没有测试过这个,所以这只是一个粗略的轮廓,而不是一个完整的工作解决方案,

  • 我说得太早了!:-( 我能够清除终端中的缓存,没有异常等,但是当我加载站点时,我得到以下信息:`传递给 Symfony\Component\Cache\Adapter\MemcachedAdapter::__construct() 的参数 1 必须是一个实例Memcached,给出的字符串`,在查看生成的代码时,我看到了这个`return $this->services['cache.app'] = new \Symfony\Component\Cache\Adapter\TraceableAdapter(new \Symfony\Component\ Cache\Adapter\MemcachedAdapter('kRTmoLLARw'));` 我不知道为什么有一个字符串而不是我们的客户端! (2认同)
  • /sf/ask/3716079881/ (2认同)