【问题标题】:Weird session behaviour in codeignitercodeigniter 中的奇怪会话行为
【发布时间】:2011-08-18 07:04:59
【问题描述】:

以下代码可以正常工作..

$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) 时,它会显示信息。会话有内存限制吗??

谢谢

【问题讨论】:

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

标签: php session codeigniter


【解决方案1】:

我在我的一个应用程序中也注意到了同样的问题。调试问题让我发现 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;

    }

}   

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 2014-03-03
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多