Cómo almacenar sesiones de Symfony 5 en Redis

Cómo almacenar sesiones de Symfony 5 en Redis

De forma predeterminada, un proyecto nuevo de Symfony almacena sesiones en archivos, específicamente en el directorio /project/var/sessions/, este se configura en el archivo framework.yaml del proyecto:

# see https://symfony.com/doc/current/reference/configuration/framework.html
framework:
    secret: '%env(APP_SECRET)%'
    #csrf_protection: true
    #http_method_override: true

    # Habilita el soporte de sesiones. Tenga en cuenta que la sesión SÓLO se iniciará si lee o escribe desde ella.
    # Elimina o comente esta sección para deshabilitar explícitamente el soporte de sesión.
    session:
        handler_id: session.handler.native_file
        save_path: '%kernel.project_dir%/var/sessions/%kernel.environment%'

Sin embargo, bajo ciertas condiciones y arquitectura de tu aplicación, necesitarás usar Redis para almacenar las sesiones de tu proyecto. Afortunadamente, Symfony hace que sea bastante fácil almacenar sesiones en la memoria con Redis usando la clase RedisSessionHandler.

En este breve artículo, te explicaré cómo configurar fácilmente Symfony 5 para usar Redis para almacenar las sesiones.

Requisitos

En este artículo, no cubriremos la instalación y configuración de Redis en sí, asumiremos que tu:

  • Tienes la extensión de Redis habilitada y funcional en su servidor de aplicaciones (PHP debería ser compatible con Redis).
  • Tienes un servidor Redis en funcionamiento y conoces la URL del HOST, el PUERTO y la CONTRASEÑA si es necesario. En este caso, usaremos un servidor Redis que se ejecuta en Docker en la máquina host, para que podamos probar si funciona.

1. Define los parámetros de Redis

Lo primero que debes hacer es crear los parámetros para acceder a Redis en tu archivo .env, que generalmente son 3:

  • REDIS_HOST: La IP o dominio del servidor Redis, por ejemplo, 127.0.0.1 o localhost.
  • REDIS_PORT: el puerto para acceder a Redis, generalmente 6379
  • REDIS_PASSWORD: Define la contraseña para acceder a tu servidor Redis si es necesario.
# project/.env
###> redis ###
REDIS_HOST="127.0.0.1"
REDIS_PORT=6379
REDIS_PASSWORD=""
###< redis ###

Estos parámetros se utilizarán y obtendrán de los archivos de configuración.

2. Configurar RedisSessionHandler

A continuación, configura el servicio Redis que se inyectará en la clase RedisSessionHandler, esto requerirá las credenciales para acceder a tu servidor Redis:

# app/config/services.yaml
services:
    Redis:
        # también puedes usar las clases \RedisArray, \RedisCluster o \Predis\Client
        class: Redis
        calls:
            - connect:
                - '%env(REDIS_HOST)%'
                - '%env(int:REDIS_PORT)%'
            # Si tu servidor Redis requiere una contraseña, elimine el comentario de las siguientes líneas:
            # - auth:
            #     - '%env(REDIS_PASSWORD)%'

    Symfony\Component\HttpFoundation\Session\Storage\Handler\RedisSessionHandler:
        arguments:
            - '@Redis'

Si deseas definir el prefijo para el almacén de claves en Redis y el TTL (tiempo de vida), puedes definirlos como argumentos de la clase RedisSessionHandler:

# app/config/services.yaml
services:
    Symfony\Component\HttpFoundation\Session\Storage\Handler\RedisSessionHandler:
        arguments:
            - '@Redis'
            # El prefijo que se utilizará para las claves para evitar colisiones en el servidor Redis.
            - prefix: ourcodeworld_
            # El tiempo de vida en segundos.
            - ttl: 3600

Entonces, las claves almacenadas en Redis usarán el prefijo definido:

Our Code World Redis Key

3. Configure la sesión para utilizar RedisSessionHandler

Ahora solo necesita especificar que el controlador de sesión debe ser la RedisSessionHandler clase de Symfony en su framework.yaml:

# app/config/framework.yaml
# see https://symfony.com/doc/current/reference/configuration/framework.html
framework:
    session:
        handler_id: Symfony\Component\HttpFoundation\Session\Storage\Handler\RedisSessionHandler

Al hacer esto, ahora estarás usando Redis para almacenar sesiones.

4. Verificando Sesiones

Puedes iniciar ahora tu aplicación Symfony que debería funcionar, como de costumbre, sin embargo, las sesiones se almacenarán en Redis. Inicia sesión en tu aplicación Symfony (suponiendo que tengas algo que use el módulo de sesión de Symfony) y ahora, como estamos usando Redis desde un contenedor docker, podemos acceder fácilmente a él a través de SSH y mostrar las sesiones actuales almacenadas en Redis:

Redis List Keys

sf_ será el prefijo predeterminado si no configuraste uno personalizado en el paso 2, por lo que cada sesión que creen los usuarios se almacenará en Redis como se esperaba.

Que te diviertas ❤️!

Esto podria interesarte

Conviertete en un programador más sociable