Zend Framework 3 проблема с кэшированием Redis - PullRequest
0 голосов
/ 22 января 2019

У меня проблема с работой кэширования Redis в моем приложении ZF3.

Я пытался собрать воедино, как это сделать на разных сайтах, включая SO, и я действительно не уверен, правильно ли я поступаю.

Что я делаю до сих пор, так это:

В моем файле конфигурации global.php я добавил:

...
'redis_cache' => [
    'adapter' => [
        'name' => 'redis',
        'options' => [
            'server' => [
                'host' => '127.0.0.1',
                'port' => 6379,
            ]
        ]
    ],
]
...

В моем контроллере у меня есть

use Zend\Cache\StorageFactory;

, а затем внутри метода я пытаюсь проверить кэш с помощью

$redis = StorageFactory::factory ($this->config['redis_cache']);


    if ($redis->hasItem ('mykey'))
    {
        $value = $redis->getItem('mykey');
    }

    echo 'value = ' . $value;

Это не получение значения. Однако если я выполню print_r () для $ redis, я вижу, что объект Redis создан.

1 Ответ

0 голосов
/ 23 января 2019

В случае, если это кому-то поможет, это решение я нашел.

Во-первых, мне нужно было установить zend-serializer, у меня уже был установлен zend-cache.

php composer require zendframework/zend-serializer

Затем в /config/autoload/global.php я добавил

'caches' => [
    'RedisCache' => [
        'adapter' => [
            'name'    => Redis::class,
            'options' => [
                'server' => [
                    'host' => '127.0.0.1',
                    'port' => '6379',
                ],
            ],
        ],
        'plugins' => [
            [
                'name' => 'serializer',
                'options' => [
                ],
            ],
        ],
    ],
],

В /config/application.config.php я добавил

'service_manager' => [
    'factories' => [
        \Zend\Cache\Storage\Adapter\Redis::class => InvokableFactory::class
    ]
]

Наконец, в моей фабрике контроллеровЯ настроил внедрение зависимости следующим образом:

public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
    $cache = $container->get('RedisCache');

    return new IndexController($cache);
}

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

public function __construct($cache)
{
    $this->cache = $cache;
}

и в методе:

$this->cache->setItem('foo', 'bar');
echo $this->cache->getItem('foo');
...