使用Javascript解析PHP会话
我最近进入了使用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前场,但它失去了它的类型和没有读空条目等,所以我停止的
感谢,
我比较肯定PHP使用序列化和反序列化功能处理会话数据。
有一个JavaScript实现的PHP.JS反序列化的,你可以在这里找到:力PHP使用JSON代替:
只是为了我发现的方式回复下面的类,使用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;
}
}
?>
这是基于phpjs的反序列化功能的session_decode功能: https://github.com/vianneyb/phpjs/blob/master/functions/var/session_decode.js
适合我!
谢谢!这对我而言,而php-unserialize没有。 – 2014-12-08 21:22:31
我有同样的问题。我需要整合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'
}
我还没有和node.js中工作过。在将它传递给node.js之前,是否可以[PHP] _php.net/manual/en/function.json-encode.php PHP中的非序列化会话数据? – Gordon 2010-07-12 08:11:51
你可以显示一个例子而不是模式吗?缺少什么东西时它看起来如何? – galambalazs 2010-07-12 08:37:05
我添加了模式,虽然正如我所说的那样粘贴它时存在某种错误,并且stackoverflow不会将数据格式化为代码:(。galam,因为我也在编辑中声明我尝试过JSON,但它似乎打破了字符串使得它不可能检索会话数据:(。也许有一些东西在那,但是,如果我做一个节点字段并将会话数据复制到一个json字符串中...并为该字段创建一个dejsonifier .... hmmmm可以工作 – Sammaye 2010-07-12 09:10:24