2012-03-30 9 views
6

En el proceso de utilización de tercera parte (Django) gestión de sesiones en PHP, tengo que tener funciones de serialización personalizados con el fin de codificar/decodificar correctamente para adaptarse almacenamiento salado de Django de datos de sesión. Actualmente, parece que la configuración ini session.serialize_handler puede ser php o wddx.serialize_handler personalizado para SessionHandler PHP personalizado (almacenamiento DB)

¿Hay alguna forma de configurar un serialize_handler personalizado como clase?

Me gustaría tener algo como esto:

class CustomSessionSerializer { 

    public static function serialize($data){ 
    // Serializes raw data 
    } 

    public static function unserialize($sdata){ 
    // Deserializes serialized data 
    } 
} 

y haga que sea utilizado por mi costumbre SessionHandler.

igbinary project on github parece agregar un serialize_handler personalizado como una extensión de php. Tengo curiosidad por saber si la serialización personalizada no podría suceder en otro lugar que no sea como una extensión C.

+0

proyecto igbinary en github (https://github.com/igbinary/igbinary) parece lograr la serialización personalizada, pero esto va más allá de lo que esperaba de la personalización de php. –

+0

No creo que sea posible hacerlo en PHP simple, a menos que se haga cargo de todo el superglobal '$ _SESSION' y escriba todo lo relacionado con la sesión usted mismo. –

Respuesta

0

Puede utilizar session_set_save_handler() utilizar sus funciones de gestión propia sesión

En PHP 5.4 se puede utilizar SessionHandlerInterface.

De manera predeterminada, recibirá datos ya serializados, por lo que tendrá que deserializarlos y usar sus propias rutinas de serialización.

+0

Crack, si le das un vistazo más de cerca a mi pregunta, verás que ya he configurado un controlador de sesión personalizado.La pregunta es acerca de la serialización personalizada ya que este paso ocurre justo antes de la lectura, y justo después de escribir. –

+0

Se le deja con lo que session.serialize_handler le permite hacer (simple o con extensiones PHP), o con el uso de controladores 'leer' y' escribir' y hacer una serialización personalizada -> serialización PHP/desserialización PHP -> serialización personalizada en ellos. – Crack

0

Puede parecer una solución alternativa pero hace lo que necesita. La serialización se aplica cuando el controlador de sesión personalizado recibe el superglobal $_SESSION y debe devolverlo desde el controlador de lectura como serializado. Pero puede almacenar la sesión como cualquier serialización o formato o cualquier cosa que desee.

Ejemplo

class SessionHandler { 

    public function __construct() { 
     session_set_save_handler(
      array($this, 'open') 
      ,array($this, 'close') 
      ,array($this, 'read') 
      ,array($this, 'write') 
      ,array($this, 'destroy') 
      ,array($this, 'gc') 
     ); 
    } 

    public function open($savePath, $sessionName) { 
     return true; 
    } 

    public function close() { 
     return true; 
    } 

    public function read($id) { 
     $data = CustomStorage::fetchSessionData($id); 
     return serialize(
      CustomSerialization::unserialize($data); 
     ); 
    } 

    public function write($id, $serializedData) { 
     CustomStorage::writeSessionData(
      $id 
      ,CustomSerialization::serialize(unserialize($serializedData)) 
     ); 
     return true; 
    } 

    //gc and destroy 
} 

Aunque no es bonito y con un poco de cabeza, pero sólo es necesario controlar la serialización cuando se almacenan, por lo que debe hacer el truco.

Espero que ayude!

+0

gracias capi, desafortunadamente, parece que la serialización rara ocurre cuando se llama a session_encode, y no me parece que este paso pueda ser cancelado –

2

He estado lidiando con este problema, y ​​hay una solución para esto.

La idea es que, aunque puede modificar fácilmente el session.serializer_handler desde PHP, puede vaciar el contenido de $ _SESSION antes de ejecutar el serializador.
El uso de una clase para la administración de la sesión (como Zend \ Session \ SessionManager) en el que está registrado con register_shutdown_function una función, en la que se pasa de nuevo a save_handler una copia de $ _SESSION contenido y luego $ _SESSION está vacía.

Para que el serializador se ejecute pero en una cadena vacía, y la serialización personalizada se ejecuta en su personalizado save_handler.

Cuestiones relacionadas