Разбор PHP сессии в Javascript

недавно я начал расширять свой сайт с помощью node.js и пришли к пониманию, что мне нужен обработчик сеанса для моих сеансов PHP. Теперь все было круто, денди и НОД.js читает сеансы php и может предлагать свой собственный сеанс с php. Я использую сеансы базы данных, поэтому данные сеанса сохраняются в поле в базе данных.

однако я нашел небольшую проблему. Я пытаюсь прочитать данные сеанса в node.js и это действительно довольно странная струна. Я смог получить структуру каждой переменной сеанса до:

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

теперь на некоторых строках поле значения может отсутствовать на других строках, длина может отсутствовать (когда переменная равна Null). Тип также может быть больше b, s, i; он также может быть N (NULL).

Я изначально придумал огромный переводчик для JS, но это как-то кажется очень неправильным способом сделать это.

кто-нибудь здесь пытался извлечь сеанс php переменные в JS раньше и есть ли какой-либо скрипт, который может помочь? Возможно, есть форматирование, которое я могу использовать на стороне PHP, чтобы сделать мою жизнь намного проще в node.Яш?

Edit: схема выглядит так:

{ _id: { id: 'L:u00c1u009du008eu00adu000e}<u0002u0000u0000' }
, 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 поле раньше, но он потерял его типы и не читал нулевые записи и т. д. Поэтому я остановил это

спасибо,

4 ответов


Я почти уверена, что PHP использует сериализовать и восстановить функции для обработки данных сессии.

существует реализация JavaScript unserialize в PHP.JS, вы можете найти его здесь: http://phpjs.org/functions/unserialize


вот функция session_decode, основанная на несериализованной функции phpjs: https://github.com/vianneyb/phpjs/blob/master/functions/var/session_decode.js

работает для меня!


просто чтобы ответить так, как я нашел: заставить PHP использовать JSON вместо:

используйте класс ниже, с session_set_save_handler для хранения данных как JSON и пусть PHP все еще использует свою собственную систему. Свяжите этот класс с помощью этой функции в начале каждого сценария, используемого сеанса : http://php.net/manual/ru/function.session-set-save-handler.php

PS: здесь класс использует memcache для хранения результирующего объекта JSON на узле.JS, используйте объект memcache и получить вот так:

  • получить PHPSESSID из cookies
  • используйте эту строку символов, чтобы принести ключ из memcached с "сеансами/id", где id является ключом, а сеанс-только строкой (см. класс ниже).

теперь у вас должен быть только JSON в memcache, поэтому это становится простой игрой с Node.JS для работы.

PS: конечно, вы можете работать с / улучшить это, вы также можете использовать это не только с memcache (БД для пример)

<?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;
    }
}
?>

у меня была та же проблема. Мне нужно было интегрировать 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'
}