Codeigniter 会话大小限制
Posted
技术标签:
【中文标题】Codeigniter 会话大小限制【英文标题】:Codeigniter session size limit 【发布时间】:2011-10-11 08:20:33 【问题描述】:当通过
将会话存储在数据库中时$config['sess_use_database'] = TRUE;
数据的大小是否限制为 TEXT ... 的 user_data 字段的大小?不像普通的 cookie 那样 4kb。
【问题讨论】:
我不确定。但如果是这样,那就太愚蠢了。 如果你保存到数据库,数据确实受到你保存数据的字段大小的限制。所以如果你使用TEXT
,你应该有足够的可用存储空间。
如果您查看 session.php 的第 293 行,它仍然会设置 cookie。
【参考方案1】:
为了进一步澄清我上面的评论,当您选择将会话数据保存在数据库中时,CodeIgniter 不会设置 cookie(当然会话 ID 除外),但会保存它应该设置的所有信息数据库中的 cookie。
如果您查看位于./system/libraries/
中的Session
类中的sess_write
,如果您启用了数据库的使用,您会看到它使用serialize
序列化数据并保存它直接到数据库。 CodeIgniter 在保存到数据库时对长度没有限制。
为方便起见,这里是源代码的链接:https://bitbucket.org/ellislab/codeigniter/src/fe2247a927ab/system/libraries/Session.php#cl-252。
唯一的限制是您选择用于将数据保存在数据库中的字段。有关 mysql 数据类型存储要求的更多信息,请阅读this。
【讨论】:
所以大约 50kb 的会话不会导致 CI 出现问题?我一直遇到我的会话数据在探查器中输出但在控制器中不可用的问题。我切换到这个会话库codeigniter.com/wiki/Session_Hybrid,问题就解决了。 @ringerce - 这应该不是问题。会话本身本质上只是另一个在读取或保存时会被序列化和反序列化的数组(除非您使用 cookie)。我将Doctrine 对象存储在我的会话中,这些对象往往很大,没有任何问题。【参考方案2】:我想这回答了你的问题。来自类代码:
// 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;
甚至 cmets 都来自班级本身。因此,如果不使用数据库,它会更新 cookie。
【讨论】:
【参考方案3】:即使我有ci_session
用于存储的表,我也发现了相同的“大小限制”问题
我只是更改了user_data = longtext
的数据类型,我的问题就解决了
虽然会话大小仅限于长文本的大小,但不是无限的
【讨论】:
【参考方案4】: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 。这意味着 BLOB(以及会话表中的序列化数据)是 limited to 65,535 bytes。请注意,此限制适用于会话数据的长度一旦它被序列化,这可能会导致相对于 RAM 中使用的存储量的一些膨胀。
当然,您可以在定义会话表时选择不同的数据类型。例如,MEDIUMBLOB 而不是 blob 会给你 16MB。这可能会也可能不会引入性能问题。
【讨论】:
以上是关于Codeigniter 会话大小限制的主要内容,如果未能解决你的问题,请参考以下文章
如何在登录系统中使用会话并在codeigniter中实现注销