用JavascriptparsingPHP会话

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

但是我发现了一个小问题。 我试图将会话数据读入node.js,这真的是一个奇怪的string。 我已经能够得到每个会话variables的结构下降到:

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

现在,在某些string中,值字段可能会丢失其他string的长度可能会丢失(当一个variables为空)。 types也可以比b,s,i多; 它也可以是N(NULL)。

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

有没有人在这里试图提取在JS中的PHP会话variables,有没有什么样的脚本可以帮助? 也许有一个格式化的东西,我可以在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 } 

这是用户会话的mongo dblogging。 需要翻译的字段是session_data。 有一种格式错误粘贴它时,因为stackoverflow不会格式化作为代码,当我尝试,使之出于某种原因。

我试图JSONfy领域之前,但它失去了它的types,并没有读空条目等,所以我就这样做了

谢谢,

我相对肯定PHP使用序列化和反序列化函数来处理会话数据。

在PHP.JS中有一个反序列化的JavaScript实现,你可以在这里find它: http ://phpjs.org/functions/unserialize

这是一个基于phpjs的反序列化函数的session_decode函数: https : //github.com/vianneyb/phpjs/blob/master/functions/var/session_decode.js

为我工作!

只是以我find的方式回复:强制PHP使用JSON,而不是:

使用下面的类,使用session_set_save_handler将数据存储为JSON,并让PHP仍然使用自己的系统。 在使用会话的每个脚本的开始处使用此函数链接此类: http : //php.net/manual/ru/function.session-set-save-handler.php

PS:这里的类使用memcache来存储JSON生成对象,在Node.JS上,使用一个memcache对象,并像这样检索:

  • 从cookie中获取PHPSESSID
  • 使用该string从memcached中带上“sessions / id”,其中id是键,session是string(见下面的类)。

现在,你只能在memcache中使用JSON,所以它正在成为一个简单的Node.JS游戏。

PS:当然你可以使用/改进这个,你也可以使用这个不仅与memcache(例如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; } } ?> 

我有同样的问题。 我需要将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' }