Pregunta ¿Cómo se inicia una sesión de Memcached en Symfony2?


Intentaré ser lo más detallado posible porque estaba buscando por ahora, 75 horas para una solución ...

Prepárense. Aquí vamos:

Estoy tratando de implementar MemcacheD manejador de sesión para Symfony2:
He descargado las bibliotecas necesarias y luego configuré Symfony2 de la siguiente manera:

En app/config.yml :

imports:
    # ....
    - { resource: services/session.yml }

framework:
    # ....
    session:
      handler_id:     session.handler.memcached

app/config/parameters.yml:

session_memcached_host:     127.0.0.1
session_memcached_port:     11211
session_memcached_prefix:   ng_
session_memcached_expire:   43200

app/services/session.yml :

services:
    session.memcached:
        class: Memcached
        arguments:
            persistent_id: %session_memcached_prefix%
        calls:
            - [ addServer, [ %session_memcached_host%, %session_memcached_port% ]]

    session.handler.memcached:
        class:     Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcachedSessionHandler
        arguments: [@session.memcached, { prefix: %session_memcached_prefix%, expiretime: %session_memcached_expire% }]

Mi pregunta más grande hasta ahora es: ¿Cómo empiezas una sesión?

Normalmente tendrías $session = new Session(); pero no para los manejadores, ya que la documentación indica (código convertido a Memcached)

$storage = new NativeSessionStorage(array(), new MemcachedSessionHandler());
$session = new Session($storage); 

y esto es realmente extraño, porque el constructor necesita Memcached instancia para el argumento, que no se da en el ejemplo del funcionario documentos

Lo que hice fue conseguir que la instancia del servicio se ejecutara:

$memcached = $this->get('session.memcached');
$storage = new NativeSessionStorage(array(), new MemcachedSessionHandler($memcached));
$session = new Session($storage); 

Esto no arrojó ninguna excepción, pero nuevamente, así que llené la sesión con datos:

$session->set('userName', $name);
$session->set('userfName', $fname);
$session->set('userPass', $pass);
$session->set('userId', $userId);
$session->set('userPost', $userPost);
$session->set('userImage', $userImage);
$session->set('logged', true);

¿Todo es perfecto? Espera ... Voy a otro controlador y ejecuto lo siguiente:

$session = $this->get('session');
var_dump($session->get('userId')); // returns null

Esto significa que o bien la sesión no se mantuvo (Memcached el registro dice lo contrario) o no lo hago bien, lo que lleva a mi segunda pregunta: ¿Cómo leo sesiones desde el servidor Memcached?

Por favor, realmente necesito que esto funcione porque los necesito en el proyecto websockets.

Siguiendo los comentarios, esto es lo que hice:

app/config/config.yml:

session:
    cookie_lifetime: 43200
    # handler_id set to null will use default session handler from php.ini
    handler_id:  session
    save_path: ~

app/config/services.yml:

services:
    session.memcached:
        class: Memcached
        arguments:
            persistent_id: %session_memcached_prefix%
        calls:
            - [ addServer, [ %session_memcached_host%, %session_memcached_port% ]]

session:
    class:     Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcachedSessionHandler
    arguments: [@session.memcached, { prefix: %session_memcached_prefix%, expiretime: %session_memcached_expire% }]

El error que recibo:

Error fatal de PHP Catchable: el argumento 1 pasado a Symfony \ Component \ HttpFoundation \ Request :: setSession () debe implementar la interfaz Symfony \ Component \ HttpFoundation \ Session \ SessionInterface, instancia de Symfony \ Component \ HttpFoundation \ Session \ Storage \ Handler \ Handler \ Handler \ Handler \ SessionSandler dado


5
2018-05-25 19:25


origen


Respuestas:


Symfony full stack framework

Si usas el framework Symfony de pila completa, configurar el memcached como un manejador de sesión es tan simple como especificarlo en tu php.ini:

session.save_handler=memcached
session.save_path=localhost:11211

Asegúrate de que handler_id se establece en nulo (~) en tus app/config/config.yml. De esta manera, Symfony usará el controlador nativo de php:

framework:
    session:
        # handler_id set to null will use default session handler from php.ini
        handler_id:  ~

Ahora puede comenzar a usar su sesión. Se almacenará en memcached.

Accediendo a la sesion

Se puede acceder a la sesión desde la Request objeto:

$request->getSession()->set('name', 'Kuba');

Componente HttpFoundation

Lo mismo se puede configurar fuera de un marco de pila completo con el componente HttpFoundation solo:

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag;
use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;

$storage = new NativeSessionStorage(array());
$session = new Session($storage, new NamespacedAttributeBag());

$request = Request::createFromGlobals();
$request->setSession($session);

El fragmento de código anterior configura la sesión como lo hace el marco completo de la pila (de forma predeterminada). De esta manera, el script en el que ingresará este código compartirá la sesión con una aplicación Symfony completa.


12
2018-05-25 22:42



Hay un buen esencia eso te ayudará a comenzar a usar MemcachedSessionHandler en tu proyecto Symfony 2.


2
2017-11-13 15:37



Preguntas populares