2011-08-18 102 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; 

    } 

} 

這將通過正確的所有級別。試一試,看看它是否適合你。