Странное поведение сессии в codeigniter - PullRequest
2 голосов
/ 18 августа 2011

Следующий код работает нормально ..

$somearray = getData();

$data = array(
    'user_display_name' => $userdisplayname,
    'username'  => $usernamefromdb,
    'logged_in'  => TRUE,
);
$this->session->set_userdata($data); // used to create user session

Это прекрасно работает с codeigniter и sqlite ..

Но когда я кодирую

$data = array(
    'user_display_name' => $userdisplayname,
    'username'  => $usernamefromdb,
    'logged_in'  => TRUE,
    'arrdata' => $somearray
);

$this->session->set_userdata($data); // used to create user session

Он говорит, что сессия прекращена... В чем может быть проблема?

Когда я делаю var_dump($somearray), это показывает информацию.Есть ли ограничение памяти для сессий ??

Спасибо

Ответы [ 2 ]

4 голосов
/ 30 ноября 2011

Я заметил ту же проблему в одном из моих приложений.Отладка проблемы привела меня к обнаружению, что CodeIgniter неправильно реализует сериализацию / десериализацию многомерных массивов.На самом деле для этого была отправлена ​​ошибка, и я думаю, что они либо исправили, либо собирались ее исправить.Взгляните на их сессию lib в Core.

function _serialize($data)
{
    if (is_array($data))
    {
        foreach ($data as $key => $val)
        {
            if (is_string($val))
            {
                $data[$key] = str_replace('\\', '{{slash}}', $val);
            }
        }
    }
    else
    {
        if (is_string($data))
        {
            $data = str_replace('\\', '{{slash}}', $data);
        }
    }

    return serialize($data);
}

Обратите внимание, что он проходит только через 1 уровень вашего массива и что ЕДИНСТВЕННЫЙ уровень, который заменяет косую черту.Проблема в том, что у вас есть многомерный массив, и, вероятно, там есть данные, которые отбрасывают сериализацию и стирают ваш сеанс.Мы исправили это, расширив их библиотеку сессий и создав следующие вызовы:

class MY_Session extends CI_Session {

    public function __construct()
    {
        parent::__construct();
    }

    function _serialize($data)
    {
        $data = $this->_serialize_backslash_recursive($data);

        return serialize($data);
    }

    function _unserialize($data)
    {
        $data = @unserialize(strip_slashes($data));

        return $this->_unserialize_backslash_recursive($data);
    }

    function _serialize_backslash_recursive($data)
    {

        if (is_array($data))
        {
            return array_map(array($this,'_serialize_backslash_recursive'), $data);
        }
        else
        {
            if (is_string($data))
            {
                return str_replace('\\', '{{slash}}', $data);
            }
        }

        return $data;

    }

    function _unserialize_backslash_recursive($data)
    {

        if (is_array($data))
        {
            return array_map(array($this,'_unserialize_backslash_recursive'), $data);
        }
        else
        {
            if (is_string($data))
            {
                return str_replace('{{slash}}', '\\', $data);
            }
        }

        return $data;

    }

}   

Теперь все уровни пройдут правильно.Попробуйте и посмотрите, работает ли он для вас.

1 голос
/ 06 сентября 2011

Codeigniter не хранит все данные сеанса в базе данных изначально (в отличие от того, что заставляет вас верить).Он сохраняет данные в файле cookie, размер которого ограничен 4 КБ, как указал Хосе Адриан.

Чтобы сохранить все данные вашего сеанса в БД, используйте этот класс сеанса замены: http://codeigniter.com/wiki/OB_Session/

Хранение данных сеанса в базе данных также будет более безопасным, чем хранение в cookie.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...