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:我建议您将该评论作为一个答案。