代码之家  ›  专栏  ›  技术社区  ›  Sammaye

在javascript中解析PHP会话

  •  9
  • Sammaye  · 技术社区  · 16 年前

    最近,我开始使用node.js扩展我的站点,并逐渐意识到我的PHP会话需要一个会话处理程序。现在一切都很好,node.js可以读取php会话,并可以将自己的会话与php会话混合。我正在使用数据库会话,以便会话数据保存到数据库中的字段中。

    但是我发现了一个小问题。我正试图将会话数据读取到node.js中,它实际上是一个非常奇怪的字符串。我已经能够将每个会话变量的结构简化为:

    'field_name'|'type':'length':'value';
    

    现在在某些字符串上,值字段可能在其他字符串上丢失,长度可能丢失(当变量为空时)。类型也可以大于b、s、i;也可以是n(空)。

    我最初为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记录。需要翻译的字段是会话数据。粘贴时有某种格式错误,因为StackOverflow在我出于某种原因尝试将其设置为代码时不会将其格式化。

    我以前试过对该字段进行JSonfy,但它丢失了类型,没有读取空条目等,所以我停止了该操作。

    谢谢,

    4 回复  |  直到 12 年前
        1
  •  5
  •   Jani Hartikainen    16 年前

    我相对确定PHP使用序列化和非序列化函数来处理会话数据。

    php.js中有一个非序列化的javascript实现,您可以在这里找到它: http://phpjs.org/functions/unserialize

        2
  •  5
  •   vianney    13 年前

    下面是一个基于phpjs非序列化函数的会话解码函数: https://github.com/vianneyb/phpjs/blob/master/functions/var/session_decode.js

    为我工作!

        3
  •  3
  •   kleopatra Aji kattacherry    14 年前

    只是用我发现的方式回复:强制PHP使用JSON:

    使用下面的类,使用session_set_save_handler将数据存储为json,让php仍然使用自己的系统。 在使用会话的每个脚本的开头使用此函数链接此类: http://php.net/manual/ru/function.session-set-save-handler.php

    ps:在这里,类使用memcache来存储js on结果对象,在node.js上,使用memcache对象,然后像这样进行检索:

    • 从cookies中获取phpssid
    • 使用该字符串从memcached中带出带有“sessions/id”的键,其中id是键,session只是字符串(请参见下面的类)。

    现在您应该在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;
        }
    }
    ?>
    
        4
  •  2
  •   Salvador Dali    12 年前

    我也有同样的问题。我需要整合 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'
    }