在Symfony3系中,使用Redis来保持会话

不同会话的处理程序

在Symfony3中,默认情况下,会将会话保存到文件中,并使用名为NativeFileSessionHandler的类。此外,还有许多用于会话的处理程序,例如用于使用MongoDB作为会话的MongoDbSessionHandler和用于使用Memcache的MemcacheSessionHandler等。

然而… ér…)

没有Redis处理程序

Redis的处理程序没有内置。有Memcache,却没有Redis。真是讨厌。顺便说一下,在Symfony4中,Redis的处理程序似乎从一开始就被内置了。
由于开发包的要求,必须使用Symfony3,但仍然想使用Redis。可能会出现这种情况。

实现Redis会话处理程序

参考了这个网站并进行了实现。
虽然该网站基于Symfony2进行了解释,但几乎没有变化。

环境

PHP: 7.2 => PHP:7.2
Symfony: 3.4 => Symfony:3.4

处理程序的实现

<?php

namespace App\Common;

use \Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler;

class NativeRedisSessionHandler extends NativeSessionHandler
{
    /**
    * Constructor.
    *
    * @param string $savePath Path of redis server.
    */
    public function __construct($savePath = "", $maxlifetime = 432000)
    {
        if (!extension_loaded('redis')) {
            throw new \RuntimeException('PHP does not have "redis" session module registered');
        }

        if ("" === $savePath) {
            $savePath = ini_get('session.save_path');
        }

        if ("" === $savePath) {
            $savePath = "tcp://localhost:6379"; // guess path
        }

        ini_set('session.save_handler', 'redis');
        ini_set('session.save_path', $savePath);
        ini_set('session.gc_maxlifetime', $maxlifetime);
    }
}

YAML的实现

在yaml文件中,为框架添加会话处理程序的指定。

services:
  session_handler_redis:
    class: App\Common\NativeRedisSessionHandler
    arguments: ['%session_redis_path%', '%session_redis_max_lifetime%']

framework:
  session:
    handler_id: session_handler_redis

parameters:
  session_redis_path: 'tcp://localhost:6379'
  session_redis_max_lifetime: 432000

增加套餐

使用上述的处理程序时,需要安装适用于PHP的包来处理Redis。
为了进行上述的实现,我使用了phpredis。
在Docker的PHP镜像中,您可以使用以下命令进行安装。

RUN git clone -b 4.3.0 https://github.com/phpredis/phpredis.git /usr/src/php/ext/redis 
RUN docker-php-ext-install redis

现在你可以在Symfony3中使用Redis了!

最终

希望Symfony的生活美好!

广告
将在 10 秒后关闭
bannerAds