2010-07-12 90 views
9

我最近进入了使用node.js扩展我的网站,并已实现我需要一个会话处理程序为我的PHP会话。现在一切都变得很酷并且很花哨,node.js读取了php会话,并且可以将它自己的会话传播给php。我正在使用数据库会话,因此会话数据被保存到数据库中的一个字段中。使用Javascript解析PHP会话

但是我发现了一个小问题。我正在尝试将会话数据读入node.js,它确实是一个很奇怪的字符串。我已经能够获取每个会话变量的strucutre到:

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

现在对某些字符串值字段可缺少其他字符串的长度可能会缺失(当变量为空)。该类型也可以比b,s,i多;它也可以是N(NULL)。

我原本以为一个JS的巨大翻译,但这只是某种程度上似乎是一个非常错误的方式来做到这一点。

有没有人试图在JS中提取php会话变量之前,有没有什么样的脚本可以帮助?也许有一个格式化的东西,我可以在PHP方面使用,使我的生活在node.js更容易吗?

编辑:架构的样子:

{ _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 
} 

这是一个用户会话蒙戈DB记录。需要翻译的字段是session_data。当粘贴它时,会出现某种格式错误,因为当我尝试将其作为代码使用时,由于stackoverflow不会将其格式化为代码。

我试图JSONfy前场,但它失去了它的类型和没有读空条目等,所以我停止的

感谢,

+1

我还没有和node.js中工作过。在将它传递给node.js之前,是否可以[PHP] _php.net/manual/en/function.json-encode.php PHP中的非序列化会话数据? – Gordon 2010-07-12 08:11:51

+0

你可以显示一个例子而不是模式吗?缺少什么东西时它看起来如何? – galambalazs 2010-07-12 08:37:05

+0

我添加了模式,虽然正如我所说的那样粘贴它时存在某种错误,并且stackoverflow不会将数据格式化为代码:(。galam,因为我也在编辑中声明我尝试过JSON,但它似乎打破了字符串使得它不可能检索会话数据:(。也许有一些东西在那,但是,如果我做一个节点字段并将会话数据复制到一个json字符串中...并为该字段创建一个dejsonifier .... hmmmm可以工作 – Sammaye 2010-07-12 09:10:24

回答

5

我比较肯定PHP使用序列化和反序列化功能处理会话数据。

有一个JavaScript实现的PHP.JS反序列化的,你可以在这里找到:力PHP使用JSON代替:

使用http://phpjs.org/functions/unserialize

+0

那是一个性感我看到他们也有序列化,所以我会尝试一下。我需要php.js来使用这些脚本还是他们声明的依赖关系? – Sammaye 2010-07-12 09:22:12

+0

我自己并没有使用PHP.JS,但我认为你可以照片k你想要的特定功能和他们的代价如果有的话 – 2010-07-12 10:55:11

+0

@Jani我不确定这是用serialize/unserialize处理的,而是用session_encode/session_decode – Gordon 2010-07-12 17:15:55

3

只是为了我发现的方式回复下面的类,使用session_set_save_handler将数据存储为JSON,并让PHP仍然使用他自己的系统。 链接这个类使用此功能在每次使用会话脚本的开头: http://php.net/manual/ru/function.session-set-save-handler.php

PS:这里的类使用内存缓存来存储JSON生成的对象,对Node.js的,使用的memcache对象,并检索像这样:

  • 从饼干得到PHPSESSID
  • 使用的字符字符串带来了关键从“会话/ ID”其中id是关键,会议只是字符串的memcached(见下类)。

现在你应该在memcache中只有JSON,所以它变成了一个简单的Node.JS游戏。

PS:当然,你可以工作/改善这一点,你也可以使用此不仅与内存缓存(例如DB)

<?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

我有同样的问题。我需要整合phpnode.js。我用js-php-unserialize来做到这一点。使用非常简单。

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

例如,如果你

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

,你会得到这样的结果:

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