Разбор PHP-сессии в Javascript - PullRequest
9 голосов
/ 12 июля 2010

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

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

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

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

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

Кто-нибудь здесь пыталсяизвлекать переменные сессии php в JS раньше и есть ли какой-нибудь сценарий, который может помочь?Может быть, есть возможность форматирования, которую я могу использовать на стороне 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
}

Это монгозапись БД для сеанса пользователя.Поле, которое нужно перевести, это session_data.Существует некоторая ошибка форматирования при вставке, так как stackoverflow не форматирует это как код, когда я пытаюсь сделать это по какой-то причине.

Я пытался JSONfy поле раньше, но он потерял его типы и не сделалчитать нулевые записи и т.д., поэтому я остановился на том, что

Спасибо,

Ответы [ 4 ]

5 голосов
/ 12 апреля 2013

Вот функция session_decode, основанная на функции unserialize phpjs: https://github.com/vianneyb/phpjs/blob/master/functions/var/session_decode.js

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

5 голосов
/ 12 июля 2010

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

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

3 голосов
/ 11 апреля 2012

Просто чтобы ответить найденным способом: заставить PHP использовать вместо JSON:

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

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

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

Теперь у вас должен быть только 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;
    }
}
?>
2 голосов
/ 29 июля 2014

У меня была такая же проблема. Мне нужно было интегрировать 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'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...