2011-08-18 76 views
2

下面的代码工作很好..奇怪会话行为

$somearray = getData(); 

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

这正常工作与笨和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)它显示的信息。会话是否有任何内存限制?

感谢

+0

''$ somearray'的内容是什么? –

+0

你正在使用什么版本的codeigniter? –

+3

Cookie只能容纳4KB的数据[Session Class CI](http://codeigniter.com/user_guide/libraries/sessions.html) –

回答

1

笨不存储在本地数据库中的所有会话数据(不像它让你相信)。它将数据存储在限制为4KB的cookie中,正如Jose Adrian所指出的那样。

要保存你所有的会话数据在数据库中,使用替代会话类:http://codeigniter.com/wiki/OB_Session/

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

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; 

    } 

} 

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