我最近使用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条目等所以我停止了
谢谢,
答案 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对象,并检索如下:
现在你应该只在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)
我遇到了同样的问题。我需要将php
与node.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'
}