在Javascript中解析PHP会话

时间:2010-07-12 07:36:58

标签: php javascript session node.js

我最近使用node.js扩展了我的网站,并且已经意识到我需要一个用于PHP会话的会话处理程序。现在一切都很酷,花花公子和node.js读取php会话,并可以传播自己与php的会话。我正在使用数据库会话,因此会话数据被保存到数据库中的一个字段中。

然而,我发现了一个小问题。我试图将会话数据读入node.js,这真是一个非常奇怪的字符串。我已经能够将每个会话变量的结构变为:

'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
}

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

我之前尝试过JSONfy这个字段,但它丢失了它的类型,并没有读取Null条目等所以我停止了

谢谢,

4 个答案:

答案 0 :(得分:5)

我相对确定PHP使用serialize和unserialize函数来处理会话数据。

在PHP.JS中有一个unserialize的JavaScript实现,你可以在这里找到它:http://phpjs.org/functions/unserialize

答案 1 :(得分:5)

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

适合我!

答案 2 :(得分:3)

只是以我发现的方式回复:强制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
  • 使用该字符串来从memcached带来一个带有“sessions / id”的密钥,其中id是密钥,session只是字符串(参见下面的类)。

现在你应该只在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;
    }
}
?>

答案 3 :(得分: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'
}