codeigniter中奇怪的会话行为

时间:2011-08-18 07:05:00

标签: php session codeigniter

以下代码工作正常..

$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 个答案:

答案 0 :(得分:4)

我在其中一个应用程序中也注意到了同样的问题。调试问题让我发现CodeIgniter没有正确实现多维数组的序列化/反序列化。实际上有一个错误提交,我相信他们要么修复它,要么修复它。看一下他们在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 :(得分:1)

Codeigniter本身不会将所有会话数据存储在数据库中(与您认为的不同)。如Jose Adrian所指出的,它将数据存储在cookie中,限制为4KB。

要将所有会话数据存储在数据库中,请使用此替换会话类:http://codeigniter.com/wiki/OB_Session/

将会话数据存储在数据库中也比将其存储在cookie中更安全。