2012-03-30 3 views
6

Bei der Verwendung von 3rd Party (Django) Session-Management innerhalb von PHP, muss ich benutzerdefinierte Serialisierungsfunktionen, um es richtig codieren/decodieren, um Django gesalzen Speicher passen Sitzungsdaten. Momentan scheint es, dass die ini-Einstellung session.serialize_handler entweder php oder wddx sein kann.Benutzerdefinierte serialize_handler für benutzerdefinierte php SessionHandler (DB-Speicher)

Gibt es eine Möglichkeit, einen benutzerdefinierten serialize_handler als Klasse einzurichten?

Ich möchte so etwas haben:

class CustomSessionSerializer { 

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

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

und es durch meine benutzerdefinierte SessionHandler verwendet haben.

igbinary project on github scheint eine benutzerdefinierte serialize_handler als PHP-Erweiterung hinzuzufügen. Ich bin neugierig, wenn benutzerdefinierte Serialisierung nicht an einem anderen Ort als als C-Erweiterung passieren konnte.

+0

igbinary Projekt auf Github (https://github.com/igbinary/igbinary) scheint benutzerdefinierte Serialisierung zu erreichen, aber das geht weit über das hinaus, was ich von PHP Anpassung erwartet habe. –

+0

Ich glaube nicht, dass es möglich ist, es in einfachem PHP zu tun, es sei denn, du übernimmst den gesamten Superglobal "$ _SESSION" und schreibst alles, was mit der Session zusammenhängt. –

Antwort

0

können Sie session_set_save_handler() benutzen, um Ihre eigenen Session-Handling-Funktionen

In PHP 5.4 Sie SessionHandlerInterface verwenden können, zu verwenden.

Standardmäßig erhalten Sie bereits serialisierte Daten, so dass Sie sie entserialisieren müssen und Ihre eigenen Serialisierungsroutinen verwenden müssen.

+0

Crack, wenn Sie sich meine Frage genauer ansehen, werden Sie sehen, dass ich bereits einen benutzerdefinierten Session-Handler eingerichtet habe.Die Frage bezieht sich auf die benutzerdefinierte Serialisierung, da dieser Schritt unmittelbar vor dem Lesen und unmittelbar nach dem Schreiben erfolgt. –

+0

Sie sind mit was session.serialize_handler können Sie tun (einfach oder mit PHP-Erweiterungen), oder mit 'lesen' und 'write' Handler und benutzerdefinierte Unsierialisierung -> PHP-Serialisierung/PHP-UNSerialisierung -> benutzerdefinierte Serialisierung in ihnen. – Crack

0

Kann wie ein Workaround aussehen, aber es tut, was Sie brauchen. Die Serialisierung wird angewendet, wenn der benutzerdefinierte Sitzungshandler den Superglobal $_SESSION empfängt und Sie ihn aus dem Lesehandler als serialisiert zurückgeben müssen. Sie können die Sitzung jedoch als eine beliebige Serialisierung oder ein beliebiges Format speichern.

Beispiel

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 
} 

Obwohl nicht schön und mit einem wenig Aufwand, aber Sie müssen nur die Serialisierung steuern, wenn die Speicherung, so dass er es tun soll.

Hoffe es hilft!

+0

danke capi, leider sieht es aus, als ob die seltsame Serialisierung passiert, wenn session_encode aufgerufen wird, und es scheint mir nicht, dass dieser Schritt abgebrochen werden kann –

2

Ich habe mit diesem Problem zu tun, und es gibt eine Lösung dafür.

Die Idee ist, dass, obwohl Sie die session.serializer_handler von PHP leicht ändern können, Sie den Inhalt von $ _SESSION leeren können, bevor Sie den Serializer ausführen.
eine Klasse für die Verwaltung der Sitzung mit (wie Zend \ Session \ Session), in dem mit register_shutdown_function eine Funktion registriert ist, in denen save_handler eine Kopie $ _SESSION Inhalt übergeben wird und dann zurück $ _SESSION ist leer.

Damit der Serializer aber auf einer leeren Zeichenfolge ausgeführt wird, und die benutzerdefinierte Serialisierung wird auf Ihrem benutzerdefinierten save_handler ausgeführt.

Verwandte Themen