【问题标题】:Parse PHP Session in Javascript在 Javascript 中解析 PHP 会话
【发布时间】: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。粘贴时会出现某种格式错误,因为当我出于某种原因尝试制作它时,stackoverflow 不会将其格式化为代码。

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

谢谢,

【问题讨论】:

  • 我之前没有使用过 node.js。在将其传递给 node.js 之前,是否可以 json_encode 来自 PHP 的未序列化会话数据?
  • 你能展示一个例子而不是架构吗?缺少东西时的样子?
  • 我添加了架构,尽管正如我所说的那样粘贴它时出现了某种错误,并且 stackoverflow 不会将数据格式化为代码:(。galam,正如我在编辑中所说的那样,我确实尝试过JSON,但它似乎破坏了字符串,使得无法检索会话数据:(。也许其中有一些东西,如果我创建一个节点字段并将 json 字符串中的会话数据复制到它......并制作一个 dejsonifier对于该领域....嗯可以工作
  • 修复了代码。为了将来参考,您需要将缩进的代码与非缩进的文本至少隔开一个空白行,然后才能正确格式化。

标签: php javascript session node.js


【解决方案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'
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-08
        • 1970-01-01
        • 1970-01-01
        • 2017-09-23
        • 1970-01-01
        • 1970-01-01
        • 2013-04-13
        • 2011-04-22
        相关资源
        最近更新 更多