Создайте класс поставщика кэша в Symfony

У нас есть memcache в нашем приложении 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% ]]

Однако на самом деле это не помогает, или я что-то упустил.

Кто-нибудь может помочь? Как мне создать этот класс провайдера?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
1 058
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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, который используется в конфигурации кеша.

Имейте в виду, что я не тестировал это, так что это скорее приблизительный набросок, чем полностью рабочее решение,

Большое спасибо, я попробую !!

delboy1978uk 29.10.2018 16:41

Я только что исправил опечатку в конфиге сервиса. При перечитывании это выглядело странно. См. symfony.com/doc/current/service_container/factories.html

dbrumann 29.10.2018 17:54

Большое спасибо, я настрою его утром и, надеюсь, все будет готово к нашему утреннему стендапу! :-D

delboy1978uk 30.10.2018 00:22

Это сработало, большое спасибо! Мне просто пришлось добавить дополнительные [] вокруг двух хостов, аргументы - это массив, поэтому он решил, что второй хост был вторым аргументом!

delboy1978uk 30.10.2018 12:46

Я заговорил слишком рано! :-( Я смог очистить кеш в терминале без исключений и т. д., Но когда я загрузил сайт, я получил следующее: Argument 1 passed to Symfony\Component\Cache\Adapter\MemcachedAdapter::__construc‌​t() must be an instance of Memcached, string given, и, посмотрев сгенерированный код, я увидел этот return $this->services['cache.app'] = new \Symfony\Component\Cache\Adapter\TraceableAdapter(new \Symfony\Component\Cache\Adapter\MemcachedAdapter('kRTmoLLAR‌​w'));, я понятия не имею, почему вместо этого есть строка нашего клиента!

delboy1978uk 31.10.2018 13:49

Можете ли вы открыть новый вопрос с ошибкой и конфигурацией вашего сервиса / кеша? Я не могу понять, почему это могло произойти.

dbrumann 31.10.2018 16:11

конечно, я сделаю это прямо сейчас

delboy1978uk 31.10.2018 16:15
stackoverflow.com/questions/53086855/…
delboy1978uk 31.10.2018 16:24

Для одного из моих проектов с 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

Другие вопросы по теме