CodeIgniter:登录后丢失会话数据

5
在codeigniter登录后,我将所有数据存储到会话中并重定向到论坛控制器。但是在论坛控制器中我失去了所有值。
当我尝试从会话中减少一些值后,它可以完美地工作。
现在我的问题是 - 为什么会发生这种情况?在codeIgniter中存储的值是否有任何上限?
即使我尝试搜索,也是如此。
redirect('forum', 'refresh');

但是它没有起作用。我的项目已经开发了一半,所以我不能使用codeignter的“PHP Native Session class”。


您可以使用本地会话类,它可以无缝集成。您可能需要将一个方法添加到该类的最大值。(至少我是这样做的) - jadkik94
@jadkik94:正如我之前提到的,我不能使用原生会话类,因为我已经开发了大多数模块,无法去更改每个文件。 - Suresh Kamrushi
将您的配置更改为将会话保存到数据库中。请参阅http://ellislab.com/codeigniter/user-guide/libraries/sessions.html。 - mallix
4个回答

7
默认情况下,CodeIgniter将会把session数据存储在cookie中,但是cookie的大小上限为4KB。如果你试图在session中存储超过4KB的数据,那么你会遇到问题。
最简单的解决方案可能是将session详细信息存储在数据库中。CodeIgniter的session文档详细介绍了如何将session存储在数据库中——只需设置一个表格,并更改几个配置参数即可。请参考CodeIgniter session documentation

4
CI会话将所有内容存储在Cookie中,可以选择加密。因此显然可能达到限制。如果存储的内容大约为2K字节,例如登录信息,则不应该存在问题。如果您使用的是如此大的内容,那么我想您就不应该这样做。
无论如何,我认为这不是问题的原因,因为我曾经遇到过类似的问题(我不记得确切的原因了)。我找到的解决方法是使用本地PHP会话类,并向其中添加一个方法:all_userdata或其他任何被称为的方法。有了它,一切都像正常会话一样工作(无需更改任何内容)。

@jadkik94,我知道你之前做过这个,但在使用原生PHP Session类之前,你是否尝试过使用CI会话DB表(被接受的答案)?如果是这样,你明白为什么它失败了吗?在我的情况下,它仍然会随机丢失会话。你能描述一下你添加的all_userdata方法吗? - Armfoot
1
@Armfoot,我不认为我尝试过数据库会话。all_userdara方法只是返回了$_SESSION数组。无论如何,我认为在CI 3.0中,他们重构了整个Session类。如果您正在使用最新版本,请参见此处 - jadkik94

2
解释: 默认情况下,CodeIgniter将会把session数据存储在cookie中,但是它的大小受浏览器限制,最大只能到2KB-4KB。如果你想要存储超过4KB的数据到session中,那么就会遇到问题。 解决方案: 最简单的解决方案是将session数据存储到数据库中。在CodeIgniter session文档中详细介绍了如何将session存储到数据库中。只需要设置一个表格,然后更改一些配置参数即可。下面是您需要进行的更改 -
在配置文件(application/config/config.php)中更新以下变量:
$config['sess_use_database'] = TRUE;
$config['sess_table_name']   = 'ci_sessions';

创建了新的表来存储会话信息 -

CREATE TABLE IF NOT EXISTS  `ci_sessions` (
session_id varchar(40) DEFAULT '0' NOT NULL,
ip_address varchar(45) DEFAULT '0' NOT NULL,
user_agent varchar(120) NOT NULL,
last_activity int(10) unsigned DEFAULT 0 NOT NULL,
user_data text NOT NULL,
PRIMARY KEY (session_id),
KEY `last_activity_idx` (`last_activity`)
);

For more info:http://goo.gl/YPllj0


1
在我的情况下,经过一些测试(使用本地主机中的https和http),错误是由于没有正确设置$config['cookie_secure']引起的,因此您可以尝试在config.php中进行更改:
$config['cookie_secure']    = FALSE; // if is not under https, or true if you use https

干杯!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接