在 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】:

我遇到了同样的问题。我需要将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'

【讨论】:

以上是关于在 Javascript 中解析 PHP 会话的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中删除 JavaScript 会话 Cookie [重复]

如何将 PHP 用户详细信息(会话)解析到 Node.js 服务器?

PHP 会话控制 cookie与session 全解析

带有警告的 PHP/Javascript 会话超时

JavaScript运行原理解析

PHP面试题精讲—Session会话完全解析!亲测有效!建议收藏!