2012-03-30 13 views
6

Nel processo di utilizzo della gestione di sessione di terze parti (django) all'interno di php, ho bisogno di funzioni di serializzazione personalizzate per codificarlo/decodificarlo correttamente per adattarlo all'archiviazione salata di django dei dati di sessione. Attualmente, sembra che l'impostazione ini session.serialize_handler possa essere php o wddx.Personalizzato serialize_handler per php personalizzato SessionHandler (archivio DB)

C'è un modo per impostare un serialize_handler personalizzato come classe?

Mi piacerebbe avere qualcosa di simile:

class CustomSessionSerializer { 

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

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

e falla usare da mia abitudine SessionHandler.

igbinary project on github sembra aggiungere un serialize_handler personalizzato come estensione php. Sono curioso di sapere se la serializzazione personalizzata non può avvenire in un posto diverso da un'estensione C.

+0

Il progetto igbinary su github (https://github.com/igbinary/igbinary) sembra raggiungere la serializzazione personalizzata, ma questo va ben oltre ciò che mi aspettavo dalla personalizzazione di php. –

+0

Non penso sia possibile farlo in PHP, a meno che non si impadronisca dell'intero superglobale '$ _SESSION' e si scriva tutto ciò che riguarda le sessioni. –

risposta

0

È possibile utilizzare session_set_save_handler() di utilizzare le funzioni di gestione propria sessione

In PHP 5.4 è possibile utilizzare SessionHandlerInterface.

Per impostazione predefinita si riceveranno i dati già serializzati, quindi sarà necessario deserializzare e utilizzare le proprie routine di serializzazione.

+0

Crack, se dai un'occhiata più da vicino alla mia domanda, vedrai che ho già impostato un gestore di sessione personalizzato.La domanda riguarda la serializzazione personalizzata poiché questo passaggio si verifica subito prima della lettura e subito dopo la scrittura. –

+0

Ti rimane ciò che session.serialize_handler ti permette di fare (semplice o con estensioni PHP), o usare i gestori 'read' e' write' e fare unserializzazione personalizzata -> serializzazione PHP/unserializzazione PHP -> serializzazione personalizzata al loro interno. – Crack

0

Potrebbe sembrare un work-around ma fa quello che ti serve. La serializzazione si applica quando il gestore di sessione personalizzato riceve il superglobale $_SESSION ed è necessario restituirlo dal gestore di lettura come serializzato. Ma puoi memorizzare la sessione come qualsiasi serializzazione o formato o qualsiasi cosa tu voglia.

Esempio

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 
} 

Anche se non è bella e con un po 'di testa, ma è sufficiente per controllare la serializzazione quando si ripone, quindi dovrebbe fare il trucco.

Spero che aiuti!

+0

grazie capi, sfortunatamente, sembra che la strana serializzazione avvenga quando viene chiamato session_encode, e non mi sembra che questo passo possa essere cancellato –

2

Ho avuto a che fare con questo problema, e c'è una soluzione per questo.

L'idea è che, sebbene sia possibile modificare facilmente lo session.serializer_handler da PHP, è possibile svuotare il contenuto di $ _SESSION prima di eseguire il serializzatore.
Utilizzando una classe per la gestione della sessione (come Zend \ Session \ SessionManager), in cui è registrato con register_shutdown_function una funzione, in cui viene passato di nuovo a save_handler una copia di $ _SESSION contenuti e poi $ _SESSION è vuoto.

In modo che il serializzatore funzioni ma su una stringa vuota e la serializzazione personalizzata viene eseguita sul numero personalizzato save_handler.

Problemi correlati