在 Javascript 中解析 PHP 会话
Posted
技术标签:
【中文标题】在 Javascript 中解析 PHP 会话【英文标题】:Parse PHP Session in Javascript 【发布时间】:2011-03-14 16:28:59 【问题描述】:我最近开始使用 node.js 扩展我的网站,并意识到我需要一个用于我的 php 会话的会话处理程序。现在一切都很酷,花花公子,node.js 读取 php 会话并可以使用 php 传播它自己的会话。我正在使用数据库会话,因此会话数据被保存到数据库中的一个字段中。
然而,我发现了一个小问题。我正在尝试将会话数据读入 node.js,这确实是一个很奇怪的字符串。我已经能够将每个会话变量的结构简化为:
'field_name'|'type':'length':'value';
现在在某些字符串上,值字段可能在其他字符串上丢失,长度可能会丢失(当变量为 Null 时)。类型也可以多于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。粘贴时会出现某种格式错误,因为当我出于某种原因尝试制作它时,*** 不会将其格式化为代码。
我之前尝试过 JSONfy 该字段,但它丢失了它的类型并且没有读取 Null 条目等,所以我停止了
谢谢,
【问题讨论】:
我之前没有使用过 node.js。在将其传递给 node.js 之前,是否可以json_encode
来自 PHP 的未序列化会话数据?
你能展示一个例子而不是架构吗?缺少东西时的样子?
我添加了架构,尽管正如我所说的那样粘贴它时出现了某种错误,并且 *** 不会将数据格式化为代码:(。galam,正如我在编辑中所说的那样,我确实尝试过JSON,但它似乎破坏了字符串,使得无法检索会话数据:(。也许其中有一些东西,如果我创建一个节点字段并将 json 字符串中的会话数据复制到它......并制作一个 dejsonifier对于该领域....嗯可以工作
修复了代码。为了将来参考,您需要将缩进的代码与非缩进的文本至少隔开一个空白行,然后才能正确格式化。
【参考方案1】:
我比较确定 PHP 使用序列化和反序列化函数来处理会话数据。
在PHP.JS中有一个反序列化的javascript实现,你可以在这里找到它:http://phpjs.org/functions/unserialize
【讨论】:
这是一个性感的脚本,我试试看。我看到他们也被序列化了,所以我会尝试一下。我需要 php.js 来使用这些脚本还是只需要它们声明的依赖项? 我自己没有使用过 PHP.JS,但我认为您可以选择您想要的特定函数及其依赖项(如果有) @Jani 我不确定这是用序列化/反序列化处理,而是用 session_encode/session_decode 你可能是对的戈登。看起来还没有 JS 实现 - @Sammaye 你最好的选择可能是看看你是否可以通过反序列化让它运行,因为格式非常相似但不完全是一对一的,如果您遇到问题修改函数以使其更像 session_decode(比从头开始编码工作更少) 是的,如果你添加 'fieldname'|'serialisedarray' 就像它与 JS 1to1 一样工作。需要做更多的测试才能说它有效,并且我需要将对象存储在一个数组中,以便它们可以被忽略但不会被 node.js 删除,但它似乎确实可以工作:D【参考方案2】:只是用我发现的方式回复:强制 PHP 使用 JSON 代替:
使用下面的类,用 session_set_save_handler 将数据存储为 JSON 并让 PHP 仍然使用他自己的系统。 在您使用 session 的每个脚本的开头使用此函数链接此类: http://php.net/manual/ru/function.session-set-save-handler.php
PS:这里的类使用 memcache 来存储 JSON 结果对象,在 Node.JS 上,使用 memcache 对象,然后像这样检索:
从 cookie 中获取 PHPSESSID 使用该字符串从 memcached 中获取带有“sessions/id”的键,其中 id 是键,会话只是字符串(参见下面的类)。现在你应该在 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】:这里是一个基于phpjs的反序列化函数的session_decode函数: https://github.com/vianneyb/phpjs/blob/master/functions/var/session_decode.js
为我工作!
【讨论】:
【参考方案4】:我遇到了同样的问题。我需要将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'
【讨论】:
以上是关于在 Javascript 中解析 PHP 会话的主要内容,如果未能解决你的问题,请参考以下文章
在 PHP 中删除 JavaScript 会话 Cookie [重复]