2015-11-14 4 views
0

У меня есть приложение Symfony 1.4, которое я только что изменил, чтобы сохранить данные сеанса в таблице сеансов в базе данных mysql.извлечение сериализованных данных сеанса пользователя

Ниже приведен пример сериализованного поля session_data таблицы mysql.

symfony/user/sfUser/lastRequest|i:1447469750; 
symfony/user/sfUser/authenticated|b:1; 
symfony/user/sfUser/credentials|a:0:{} 
symfony/user/sfUser/attributes|a:2: 
{s:30:"symfony/user/sfUser/attributes"; 
a:3:{s:12:"current_page"; 
s:6:"splash";s:15:"logged_in_token"; 
s:31:"e9psz6e3iko4scsk0c4k4wckwk4k0k4"; 
s:25:"available_credits_session"; 
i:0;}s:19:"sfGuardSecurityUser"; 
a:1:{s:7:"user_id";s:1:"1";}} 
symfony/user/sfUser/culture|s:2:"en"; 

Я хотел бы извлечь из этой сериализованной информации две части информации.

1) идентификатор logged_in_token, который я использую, так что пользовательский идентификатор пользователя не отображается.

и

2) идентификатор_пользователя который является фактическим идентификатором пользователя.

Причина, по которой мне нужна эта информация, заключается в том, что они могут иметь только один активный сеанс за раз.

Так что, если в таблице сеанса есть два одинаковых идентификатора пользователя, я буду использовать эту информацию для выхода из системы или тайм-аута предыдущей сессии.

это, по-видимому, особый «путь symfony» для сериализации данных.

Любая идея о том, как извлечь эту информацию в узле или Javascript будет весьма признателен

ответ

1

Путь эти данные сериализовано не является специфичным для symfony, она специфична для php. В зависимости от session.serialize_handler настройка в php.ini php сериализует данные сеанса по-разному. Значение по умолчанию для этого параметра - php, которое, по-видимому, используется в вашем случае.

Я использую следующий метод в php, чтобы избежать этой кодировки - он выводит регулярный массив с данными. Ничего php конкретного здесь, так что вы можете легко перенести его в JavaScript: (однако лучшее решением было бы сделать «неэкранированный» перед сохранением этих данных в базу данных, то вам не нужно делать это на яваскрипт стороны)

function unserializePhp($sessionData) 
{ 
    $returnData = array(); 
    $offset = 0; 
    while ($offset < strlen($sessionData)) { 
     if (!strstr(substr($sessionData, $offset), '|')) { 
      throw new Exception('invalid data, remaining: ' . substr($sessionData, $offset)); 
     } 
     $pos = strpos($sessionData, '|', $offset); 
     $num = $pos - $offset; 
     $varname = substr($sessionData, $offset, $num); 
     $offset += $num + 1; 
     $data = unserialize(substr($sessionData, $offset)); 
     $returnData[$varname] = $data; 
     $offset += strlen(serialize($data)); 
    } 

    return $returnData; 
} 
+0

Спасибо, сэр. Я пытался понять это так долго, что это смущает. Я отредактировал с действующим кодом symfony на основе вашего предложения. Огромное спасибо. – smugford

Смежные вопросы