Разбор 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'
}