2010-07-12 11 views
9

Recientemente he ido a ampliar mi sitio usando node.js y he llegado a la conclusión de que necesito un controlador de sesión para mis sesiones de PHP. Ahora todo fue genial y elegante y node.js lee las sesiones de php y puede propocionar su propia sesión con las de php. Estoy usando sesiones de base de datos para que los datos de la sesión se guarden en un campo en la base de datos.Parse PHP Session en Javascript

Sin embargo, he encontrado un pequeño problema. Estoy intentando leer los datos de la sesión en node.js y es realmente una cadena bastante extraña. He sido capaz de obtener el strucutre de cada variable de sesión a:

'field_name'|'type':'length':'value'; 

Ahora, en determinadas cadenas de valor del campo puede faltar en otras cadenas de la longitud puede faltar (cuando una variable es nulo). El tipo también puede ser más que b, s, i; también puede ser N (NULO).

Originalmente había pensado en un gran traductor para JS, pero esto de alguna manera parece ser una manera muy incorrecta de hacerlo.

¿Alguien ha intentado extraer las variables de sesión de php en JS antes y hay algún tipo de script que pueda ayudar? ¿Quizás hay algo de formato que puedo usar en PHP para hacer mi vida mucho más fácil en node.js?

Editar: el esquema se parece a:

{ _id: { id: 'L:\u00c1\u009d\u008e\u00ad\u000e}<\u0002\u0000\u0000' } 
, session_id: 'a2clfnjhopv1srs5k5elgbfjv5' 
, user_id: 0 
, session_data:  'logged|b:0;uid|i:0;server_key|N;AUTH_TIER2|b:0;email|s:0:"";cheese|s:6:"cheese";' 
, active: 1 
, expires: 1278920567 
} 

Este es el registro db mongo para una sesión de usuario. El campo que debe traducirse es session_data. Existe algún tipo de error de formateo al pegarlo, ya que stackoverflow no lo formateará como código cuando intente hacerlo por alguna razón.

Me trataron de JSONfy el campo antes, pero perdió su tipo y no leer entradas nulas, etc, así que se detuvo

que

Gracias,

+1

no he trabajado con Node.js antes. ¿Sería posible ['json_encode'] (http://uk2.php.net/manual/en/function.json-encode.php) los datos de sesión no serializados de PHP antes de pasarlo a node.js? – Gordon

+0

¿Puedes mostrar un ejemplo en lugar del esquema? ¿cómo se ve cuando algo falta? – galambalazs

+0

Agregué el esquema, aunque como dije, hubo algún tipo de error al pegarlo y stackoverflow no formateará los datos para que sean código :(. Galam, como también afirmo en la edición que probé JSON, pero pareció romper el cadena que hace imposible recuperar datos de sesión :(. Tal vez hay algo en eso, si hago un campo de nodo y copio los datos de la sesión en una cadena json ... y hago un dejsonificador para el campo .... hmmmm podría funcionar – Sammaye

Respuesta

5

estoy relativamente seguro de PHP utiliza las funciones serializar y unserialize para manejar los datos de la sesión.

Hay una implementación de JavaScript de unserialize en PHP.JS, se puede encontrar aquí: http://phpjs.org/functions/unserialize

+0

Esa es una sexy script Imagínenlo. Vi que también se serializaron, así que los probaré. ¿Necesito php.js para usar estos scripts o solo las dependencias que dicen? – Sammaye

+0

No he usado PHP.JS, pero creo que puedes simplemente pic k las funciones específicas que desea y sus deps si hay –

+0

@Jani No estoy seguro de que esto se maneje con serialize/unserialize, sino con session_encode/session_decode – Gordon

3

Sólo para responder con la forma que he encontrado: PHP fuerza para utilizar JSON lugar:

Uso la clase a continuación, con session_set_save_handler para almacenar datos como JSON y dejar que PHP siga usando su propio sistema. Enlace esta clase mediante esta función al principio de cada secuencia de comandos utiliza sesión: http://php.net/manual/ru/function.session-set-save-handler.php

PS: aquí el uso Memcache clase para almacenar JSON objeto resultante, en Node.JS, utilice un objeto Memcache, y recuperar como esto :

  • obtener el PHPSESSID de las cookies
  • uso que los caracteres de cadena para llevar una llave de memcached con "sesiones/id" donde id es la clave y la sesión sólo la cadena (véase la clase más adelante).

Ahora debe tener solo JSON en Memcache, por lo que se está convirtiendo en un juego simple con Node.JS para trabajar.

PD: por supuesto, se puede trabajar con/mejorar esto, también puede utilizar esto no sólo con memcache (una base de datos, por ejemplo)

<?php 
/** 
* This class is used to store session data with memcache, it store in json the session to be used more easily in Node.JS 
*/ 
class memcacheSessionHandler{ 
    private static $lifetime = 0; 
    private static $memcache = null; 

    public function __construct(){ 
      self::$memcache = new Memcache(); 
      self::$memcache->addServer('localhost', 11211); 
} 

    public function __destruct(){ 
      session_write_close(); 
      self::$memcache->close(); 
      self::$memcache = null; 
    } 

    public static function open(){ 
      self::$lifetime = ini_get('session.gc_maxlifetime'); 
      return true; 
    } 

    public static function read($id){ 
      $tmp = $_SESSION; 
      $_SESSION = json_decode(self::$memcache->get("sessions/{$id}"), true); 
      $new_data = session_encode(); 
      $_SESSION = $tmp; 
      return $new_data; 
    } 

    public static function write($id, $data){ 
      $tmp = $_SESSION; 
      session_decode($data); 
      $new_data = $_SESSION; 
      $_SESSION = $tmp; 
      return self::$memcache->set("sessions/{$id}", json_encode($new_data), 0, self::$lifetime); 
    } 

    public static function destroy($id){ 
      return self::$memcache->delete("sessions/{$id}"); 
    } 

    public static function gc(){ 
      return true; 
    } 

    public static function close(){ 
      return true; 
    } 
} 
?> 
2

Tuve el mismo problema. Necesitaba integrar php con node.js. Usé js-php-unserialize para hacer esto. El uso es bastante directo.

var PHPUnserialize = require('php-unserialize'); 
console.log(PHPUnserialize.unserializeSession(yourData)); 

Por ejemplo, si

var yourData = 'A|s:1:"B";userID|s:24:"53d620475e746b37648b4567";'; 

obtendrá el siguiente resultado:

{ 
    A: 'B', 
    userID: '53d620475e746b37648b4567' 
}