Codeigniter会话大小限制

时间:2011-07-22 20:02:20

标签: php mysql session codeigniter cookies

通过

将会话存储在数据库中时
$config['sess_use_database']    = TRUE;

数据的大小是否限制为user_data字段的大小,即TEXT ...?不像普通的cookie那样4kb。

4 个答案:

答案 0 :(得分:4)

为了进一步澄清上面的评论,当您选择将会话数据保存在数据库中时,CodeIgniter不会设置cookie(当然不是会话ID),而是保存它将设置的所有信息。数据库中的cookie。

如果您查看位于sess_write的{​​{1}}类中的Session,如果您已启用数据库,则会看到它序列化了数据使用./system/libraries/并将其直接保存到数据库。 CodeIgniter在保存到数据库时对长度没有限制。

为方便起见,这里是源代码的链接:https://bitbucket.org/ellislab/codeigniter/src/fe2247a927ab/system/libraries/Session.php#cl-252

唯一的限制是由您选择用于在数据库中保存数据的字段设置。有关MySQL数据类型存储要求的详细信息,请阅读this。< / p>

答案 1 :(得分:1)

即使我有ci_session表用于存储

,我也发现了相同的“大小限制”问题

我只是更改user_data = longtext的数据类型和我的问题解决

虽然会话大小仅限于长篇文章的大小而不是无限制

答案 2 :(得分:0)

我猜这回答了你的问题。来自班级代码:

// Are we saving custom data to the DB?  If not, all we do is update the cookie
if ($this->sess_use_database === FALSE)
{
    $this->_set_cookie();
    return;
}

甚至评论都来自班级本身。所以如果不使用数据库,它会更新cookie。

答案 3 :(得分:0)

CI session docs为您的会话数据指定 BLOB 数据列。

CREATE TABLE IF NOT EXISTS `ci_sessions` (
        `id` varchar(128) NOT NULL,
        `ip_address` varchar(45) NOT NULL,
        `timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
        `data` blob NOT NULL,
        KEY `ci_sessions_timestamp` (`timestamp`)
);

根据MySQL Docs,此存储类型需要 L + 2个字节,其中L <2 ^ 16 。这意味着BLOB(因此会话表中的序列化数据)为limited to 65,535 bytes。请注意,此限制适用于会话数据的长度,一旦它被序列化,相对于RAM中使用的存储量,这可能会导致一些膨胀。

您当然可以在定义会话表时选择其他数据类型。例如, MEDIUMBLOB (而不是blob)将为您提供16MB。这可能会或可能不会带来性能问题。