Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php codeigniter中奇怪的会话行为_Php_Session_Codeigniter - Fatal编程技术网

Php codeigniter中奇怪的会话行为

Php codeigniter中奇怪的会话行为,php,session,codeigniter,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 这可以与

下面的代码可以正常工作

$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\u dump($somearray)
时,它会显示信息。会话是否有内存限制


谢谢

Codeigniter不会以本机方式将所有会话数据存储在数据库中(这与它让您相信的情况不同)。它将数据存储在cookie中,正如Jose Adrian所指出的,cookie限制为4KB

要在数据库中存储所有会话数据,请使用以下替换会话类:


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

我在我的一个应用程序中也注意到了同样的问题。调试这个问题使我发现CodeIgniter没有正确地实现多维数组的序列化/非序列化。实际上有一个bug提交了,我相信他们要么修复了它,要么即将修复它。看看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;

    }

}   

这将正确地通过所有级别。试一试,看看它是否适合您。

什么是
$somearray
的内容?cookie只能保存4KB的数据@JoseAdrian谢天谢地,会话没有存储在cookie中。只有会话id存储在那里,会话只存储在服务器上。@Pelle:来自Jose的链接:“会话数组的一个有用方面是,您可以向其中添加自己的数据,它将存储在用户的cookie中。”CodeIgniter会话中的数据不存储在服务器端,就像您对大多数会话实现所期望的那样。@Jose:我建议您将该评论作为一个答案。